c ++ - 不完整的类型/转发声明

时间:2015-03-30 19:27:19

标签: c++ class c++11 declaration forward-declaration

这个问题已被多次询问,但通常可以通过改变课程的顺序来轻松解决。在我的情况下,它可能不是。

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'错误

1 个答案:

答案 0 :(得分: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(); }