【发布时间】:2016-03-19 16:34:50
【问题描述】:
这是简化的代码,只是为了说明我的问题:
main.cpp
#include "one.hpp"
#include <iostream>
int main(){
One one;
std::cout << one.two->val;
}
一个.hpp:
struct Two; <- forward declare Two
struct One{
One();
~One() { delete two;}
Two* two;
};
一个.cpp
#include "one.hpp"
struct Two{
int val;
};
One::One(): two(new Two()) {}
编译时我得到错误无效使用不完整类型“结构二”。 我假设由于 Two 是不完整的类型,我无法引用它的字段... 我想知道有没有办法在一个 cpp 文件中隐藏两个实现并使用这种前向声明在另一个 cpp 文件中使用它?问题来自创建 API,我想在某些类上隐藏实现。
【问题讨论】:
-
当然可以,但是您通过尝试查看它违反了
main中隐藏的Two(如果不包含完整定义,则无法访问Two的成员或方法是有效的Two)。 -
谢谢大家的回答,关于析构函数的评论也很有帮助。所以我现在的理解是,使用这种前向声明来隐藏实现和类定义,即像在 pimpl idiom 中一样,只有当我们在一个定义发生的翻译单元中引用前向声明的类时才有意义,否则我将不得不引入类在每个使用其方法/字段的地方定义(因此不会隐藏类定义)。所以我认为我的设计决定是不正确的......
-
“我认为我的设计决策不正确” 我不确定我是否理解您是如何得出这个结论的。您也可以将实现隐藏在标题中。请参阅下面的示例。
标签: c++ api forward-declaration pimpl-idiom