这是简化的代码,只是为了表明我的问题:
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,我希望隐藏某些类的实现。
答案 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
}