std :: function中的不完整类型

时间:2014-04-12 20:13:11

标签: c++ include std-function

我有一个Target类,类似于以下内容:

class Target
{
  std::function<void(A&,B&,C&)> Function;
}

现在,其中一个参数类型(比如说A)有一个Target成员并试图调用它的函数:

class A
{
  Target target;
  void Foo(B& b, C& c)
  {
    target.Function(*this,b,c);
  }
}

在某个地方,这两种类型出现在头文件中。鉴于循环依赖,有一个前向声明,不幸的是,error : pointer to incomplete class type is not allowed错误。

所以问题是 - 我该怎么办呢?

1 个答案:

答案 0 :(得分:1)

您遇到circular dependency问题。将target声明为class A中的指针,并在构造函数中适当地分配它,并在类的析构函数中释放它:

class A
{
  A() : target(new Target) {}
  ~A() { delete target; }
  Target *target;
  void Foo(B &b, C &c)
  {
    target->Function(*this, b, c);
  }
};

如果您的编译器支持C ++ 11,请使用智能指针:

class A
{
  A() : target(std::unique_ptr<Target>(new Target)) {}
  std::unique_ptr<Target> target;
  void Foo(B &b, C &c)
  {
    (*target).Function(*this, b, c);
  }
};