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

时间:2016-08-24 17:02:13

标签: c++

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

class Foo
{
    ...
private:
    Bar _bar;
};

我只希望Bar可以作为Foo的私有成员变量进行访问。声明和定义Bar的正确方法是什么?

选项1:在标头中定义?

我想避免这种情况,因为我不希望BarFoo类范围之外可用。

struct Bar
{
    int a;
    int b;
    ...
};

class Foo
{
    ...
private:
    Bar _bar;
};

选项2:在标题中转发声明,在cpp中定义

不确定这是否合法,如果Foo的定义不直接可用,编译器如何严格地从标题中知道Bar的大小?此外,这会将Bar隐藏在包含标题的其他文件中吗?

头:

struct Bar;

class Foo
{
    ...
private:
    Bar _bar;
};

实施档案:

struct Bar
{
    int a;
    int b;
    ...
};

选项3:在课程中声明

可能是限制范围的最佳选择,但可能是凌乱的

class Foo
{
    ...
private:
    struct Bar
    {
        int a;
        int b;
        ...
    };

    Bar _bar;
};

3 个答案:

答案 0 :(得分:9)

对于编译选项2,dequeueReusableCellWithIdentifier应该是一个指针。选项3是最好的,因为它没有污染命名空间。

答案 1 :(得分:4)

  

选项3:在课程中声明

     

可能是限制范围的最佳选择

当然,这是限制范围并且不会污染命名空间的最佳方法。选择3。

  

但可能很乱?

我没有得到你的担忧(你可能想在你的问题中详细说明),根本就没有凌乱

注意:每当需要使用它进行客户往返时,他们都可以使用auto关键字来引用Bar变量。

mentioned by R.Sahu的另一个选项是使用Pimpl Idiom

struct FooData;
class Foo {
    ...
private:

    std::unique_ptr<FooData> data_; // Note I not prefer to use leading underscores

public:
    Foo();
};

Foo的翻译单元中:

namespace {
    struct FooData;
    {
        int a;
        int b;
        ...
    };
}

Foo::Foo() : data_(std::make_unique<FooData<()) {}

答案 2 :(得分:3)

  

选项1:在标头中定义?

     

我想避免这种情况,因为我不希望Bar在Foo类范围之外可用。

使用选项一,您刚回答了自己的问题。

  

选项2:在标题中转发声明,在cpp中定义

此处与选项1(范围可见性)相同,但唯一的好处是Bar的实现不会对其他.cpp文件可见。

  

选项3:在课程中声明

选项3 是最好的,因为它符合您要求的目的,而且只有那样。此外,全班可以使用Bar。此外,嵌套该类可以防止代码中出现不必要的混乱,因为除Foo之外的任何内容都无法访问Bar。它绝对不会显得凌乱,而且,你可以像这样声明结构:

class Foo
{
private:
    struct Bar {int a, int b};
    //.....
};

对于一个小班,这看起来不错,因为它是一个班轮。缺点是向前宣布课程,这是不可能的,如答案所示:https://stackoverflow.com/a/951245/6525260