无效使用不完整类型错误

时间:2016-03-19 16:34:50

标签: c++ api forward-declaration pimpl-idiom

这是简化的代码,只是为了表明我的问题:
main.cpp中

#include "one.hpp"
#include <iostream>


int main(){
 One one;
 std::cout << one.two->val;
 }

one.hpp:

struct Two; <- forward declare Two
struct One{
One();
~One() { delete two;}
Two* two;
};

one.cpp

#include "one.hpp"
struct Two{
 int val;
};

One::One(): two(new Two()) {}

编译时我得到错误无效使用不完整类型'struct Two'。 我假设因为Two是不完整的类型我只是不能引用它的字段...... 我想知道有没有办法在一个cpp文件中隐藏两个实现并使用这种前向声明在另一个cpp文件中使用它?问题来自创建API,我希望隐藏某些类的实现。

2 个答案:

答案 0 :(得分:3)

您无法删除不完整类型的对象。

解决方案是在one.cpp中定义析构函数。

<强> one.hpp:

struct One {
  ~One();
  // ...
};

<强> one.cpp:

// ...

One::~One() { delete two; }

答案 1 :(得分:1)

维基百科:&#34;不透明指针是一种隐藏普通客户端的接口实现细节的方法,因此可以在不需要重新编译模块的情况下更改实现使用它。 &#34;

向客户发布的头文件:

struct opaque;
struct interface
{
  ~interface();
  void test();
  opaque* _p;
};

未向客户发布头文件:

struct opaque
{
  void test();
  //...
};

interface实施文件:

#include "interface.h"
#include "opaque.h"

interface::~interface()
{
  delete _p;
}

void interface::test()
{
  _p->test(); 
}
// ...

opaque实施文件:

#include "opaque.h"

void opaque::test()
{
// actual implementation
}