2015-03-30 2 views
-1

Этот вопрос задавался много раз, но обычно его можно было легко решить, изменив порядок классов. В моем случае это может быть не так.C++ - неполное объявление типа/вперед

class GCRefLink; 
class GCRef; 

class GCRefLink { 
    friend class GCRef; 
private: 
    GCRef * ref; 
    GCRefLink(GCRef * ref) : ref(ref) {} 
public: 
    ~GCRefLink(){this->ref->unlink();} 
}; 

class GCRef { 
friend class GCRefLink; 
private: 
    int refCount; 

    GCRef() : refCount(0) {} 
    virtual ~GCRef(){} 

    void unlink(){--this->refCount;if(this->refCount==0) delete this;} 
public: 
    GCRefLink link(){++this->refCount;return GCRefLink(this);} 
}; 

Когда я меняю порядок занятий, я получаю такую ​​же ошибку почти во втором классе. Он должен быть ссылочным классом для наследования управляемыми, неуязвимыми классами, я знаю, что в STL уже есть что-то подобное, но поскольку это университетский проект, мне нужно реализовать свое.

Я получаю invalid use of incomplete type 'class GCRef' или invalid use of incomplete type 'class GCRefLink' ошибки

+2

Так что прекратите определение этих функций лексически встроенным. Вопреки вашим утверждениям, это было решено много раз. –

+2

[Правило трех] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three). – Casey

+1

Вы не должны изобретать std :: shared_ptr (если вы действительно хотите это сделать, возьмите некоторые источники и настройте их на свои нужды) –

ответ

3

Было бы неправильно ставить ~GCRefLink реализацию деструктора после второго класса (в идеале в отдельном файле .cpp)?

class GCRef; 

class GCRefLink { 
    friend class GCRef; 
private: 
    GCRef * ref; 
    GCRefLink(GCRef * ref) : ref(ref) {} 
public: 
    ~GCRefLink(); 
}; 

class GCRef { 
    friend class GCRefLink; 
private: 
    int refCount; 

    GCRef() : refCount(0) {} 
    virtual ~GCRef(){} 

    void unlink(){ --this->refCount; if (this->refCount == 0) delete this; } 
public: 
    GCRefLink link(){ ++this->refCount; return GCRefLink(this); } 
}; 

GCRefLink::~GCRefLink(){ this->ref->unlink(); } 
+1

Да, и если вы собираетесь это сделать, сделайте это для всех. –

+0

Ох ... спасибо, глупый. – Lapsio

Смежные вопросы