【问题标题】:c++ - incomplete type / forward declaration [duplicate]c ++ - 不完整的类型/前向声明[重复]
【发布时间】:2015-03-30 19:27:19
【问题描述】:

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

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

【问题讨论】:

  • 所以停止在词法上内联定义这些函数。与您的说法相反,这个问题已经解决了很多次。
  • 您不应该重新发明 std::shared_ptr (如果您真的想这样做,请获取一些资源并根据您的需要进行调整)

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


【解决方案1】:

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

【讨论】:

  • 是的,如果你要为一个人做,那就为所有人做。
  • 哦...谢谢,我很傻。
猜你喜欢
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 2011-10-22
相关资源
最近更新 更多