采用以下头文件示例,其中Bar是结构:
class Foo
{
...
private:
Bar _bar;
};
Run Code Online (Sandbox Code Playgroud)
我只想Bar作为私有成员变量访问Foo.声明和定义的正确方法是什么Bar?
选项1:在标题中定义?
我想避免这种情况,因为我不想Bar在Foo课堂范围之外使用.
struct Bar
{
int a;
int b;
...
};
class Foo
{
...
private:
Bar _bar;
};
Run Code Online (Sandbox Code Playgroud)
选项2:在头文件中转发声明,在cpp中定义?
不确定这是否合法,如果编译器的定义不直接可用,编译器将如何Foo严格地知道标题的大小Bar?此外,这会隐藏Bar其他包含标题的文件吗?
标题:
struct Bar;
class Foo
{
...
private:
Bar _bar;
};
Run Code Online (Sandbox Code Playgroud)
实施文件:
struct Bar
{
int a;
int b;
...
};
Run Code Online (Sandbox Code Playgroud)
选项3:在课堂上宣布
也许是限制范围的最佳选择,但可能是凌乱的?
class Foo
{
...
private:
struct Bar
{
int a;
int b;
...
};
Bar _bar;
};
Run Code Online (Sandbox Code Playgroud)
选项 3:在类中声明
也许是限制范围的最佳选择
当然,这是限制作用域且不污染命名空间的最佳方式。转到选项 3。
但潜在的混乱?
我没有得到你的关注(你可能想在你的问题中详细说明),没有什么乱七八糟的有,在所有。
注意:每当需要从客户端使用它进行往返时,他们可以使用auto关键字来引用Bar变量。
R.Sahu 提到的另一个选择是使用Pimpl Idiom:
struct FooData;
class Foo {
...
private:
std::unique_ptr<FooData> data_; // Note I not prefer to use leading underscores
public:
Foo();
};
Run Code Online (Sandbox Code Playgroud)
和 inFoo的翻译单元:
namespace {
struct FooData;
{
int a;
int b;
...
};
}
Foo::Foo() : data_(std::make_unique<FooData<()) {}
Run Code Online (Sandbox Code Playgroud)