不完整的类型/正向声明

incomplete type / forward declaration

本文关键字:声明 类型      更新时间:2023-10-16

这个问题已经被问了很多次,但通常可以通过更改类的顺序来轻松解决。就我而言,可能不是。

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

~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(); }