在哪里定义struct只能用作私有成员变量?

sch*_*574 12 c++

采用以下头文件示例,其中Bar是结构:

class Foo
{
    ...
private:
    Bar _bar;
};
Run Code Online (Sandbox Code Playgroud)

我只想Bar作为私有成员变量访问Foo.声明和定义的正确方法是什么Bar

选项1:在标题中定义?

我想避免这种情况,因为我不想BarFoo课堂范围之外使用.

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)

Ser*_*eyA 9

对于选项2进行编译,_bar应该是一个指针.选项3是最好的,因为它不会污染命名空间.


πάν*_*ῥεῖ 5

选项 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)