2012-12-14 19 views
5

Tôi đang cố gắng để tạo ra một giao diện truy cập buộc tất cả các lớp thừa kế để thực hiện giao diện này:trọng khai thác tinh khiết ảo

class CounterInterface 
{ 
public: 
    virtual CounterInterface& operator ++() = 0; 
    virtual CounterInterface operator ++ (int) = 0; 
    virtual CounterInterface& operator --() = 0; 
    virtual CounterInterface operator -- (int) = 0; 
    virtual bool operator == (const CounterInterface o) const = 0; 
    virtual operator uint32_t() const = 0; 
    virtual void reset() = 0; 
}; 

Tuy nhiên, chỉ cần bao gồm kết quả này định nghĩa lớp trong lỗi dưới đây.

Rất tiếc, không thể xác định bài đăng là tham chiếu.

Bất kỳ ý tưởng nào giải quyết vấn đề về trứng gà này?

CounterInterface.h:25:29: error: invalid abstract return type for member function ‘virtual libceis::CounterInterface libceis::CounterInterface::operator++()’ 
CounterInterface.h:22:8: note: because the following virtual functions are pure within ‘libceis::CounterInterface’: 
CounterInterface.h:25:29: note: virtual libceis::CounterInterface libceis::CounterInterface::operator++() 
CounterInterface.h:26:29: note: virtual libceis::CounterInterface libceis::CounterInterface::operator++(int) 
CounterInterface.h:27:29: note: virtual libceis::CounterInterface libceis::CounterInterface::operator--() 
CounterInterface.h:28:29: note: virtual libceis::CounterInterface libceis::CounterInterface::operator--(int) 
CounterInterface.h:29:17: note: virtual bool libceis::CounterInterface::operator==(libceis::CounterInterface) const 
CounterInterface.h:30:12: note: virtual libceis::CounterInterface::operator uint32_t() const 
CounterInterface.h:31:17: note: virtual void libceis::CounterInterface::reset() 
CounterInterface.h:26:29: error: invalid abstract return type for member function ‘virtual libceis::CounterInterface libceis::CounterInterface::operator++(int)’ 

Trả lời

2

Bạn không thể khởi tạo lớp có chức năng thành viên ảo thuần túy. Vì bạn không thể tạo ra chúng, bạn cũng không thể quay lại khi giá trị, như bạn làm trong

virtual CounterInterface operator ++ (int) = 0; 
virtual CounterInterface operator -- (int) = 0; 
1

Trước hết bạn phải thay thế

virtual bool operator == (const CounterInterface o) const = 0; 

bởi

virtual bool operator == (const CounterInterface &o) const = 0; 

Thứ hai, tương tự điều đó nói 'Olaf Dietsche', nó nhanh hơn tôi :-)

5

Bạn đã hết may mắn. Bạn muốn trả lại giá trị với loại động động của đối tượng mà hàm được gọi. Bạn không thể: các giá trị (không phải con trỏ) trong C++ không thể là các kiểu trả về covariant vì một giá trị trả về bằng C++ không thể có một kiểu động khác với kiểu tĩnh của nó.

Về cơ bản, vấn đề này giống với việc triển khai clone() ảo. Nó không thể trả về giá trị. Bạn sẽ gặp rắc rối ngay cả khi CounterInterface không phải là một lớp trừu tượng, nhưng thay vì nhận thấy nó khi mã không biên dịch, bạn sẽ nhận thấy nó khi đối tượng trả về bị cắt.

Điều bạn có thể làm là mở rộng trên thiết kế. Viết một lớp có con trỏ (thông minh) vào một thể hiện của CounterInterface. Kiểu này có thể được trả về bởi giá trị và do đó có thể thực hiện giao diện mà bạn muốn. Nó có thể làm điều đó bằng cách gọi một hàm ảo tinh khiết CounterInterface *clone() (hoặc unique_ptr<CounterInterface> clone()) phân bổ và trả về một cá thể mới của lớp cụ thể thực hiện giao diện. Đối với các nhà khai thác mà làm việc như các chức năng ảo, bạn có thể để chúng trên CounterInterface và lớp wrapper của bạn có thể gọi thông qua, hoặc bạn có thể đổi tên họ trong giao diện ảo:

class Counter { 
    unique_ptr<CounterInterface> ctr; 
    public: 
    Counter(unique_ptr<CounterInterface> c) : ctr(std::move(c)) {} 
    Counter(CounterInterface *c) : ctr(c) {} 
    Counter &operator++() { 
     ctr->increment(); // or ++(*ctr) 
     return *this; 
    } 
    Counter operator++(int) { 
     Counter ret(ctr->clone()); 
     ctr->increment(); 
     return ret; 
    } 
    operator uint32_t() const { 
     return *ctr; 
    } 
    void reset() { 
     return ctr->reset(); 
    } 
}; 

ảo operator== là cả một vấn đề riêng biệt mà tôi sẽ để lại các câu hỏi khác trên trang web.

Btw, CounterInterface cần có trình phá hủy ảo.

Các vấn đề liên quan