采用以下头文件示例,其中Bar是结构:
class Foo
{
...
private:
Bar _bar;
};
我只希望Bar
可以作为Foo
的私有成员变量进行访问。声明和定义Bar
的正确方法是什么?
选项1:在标头中定义?
我想避免这种情况,因为我不希望Bar
在Foo
类范围之外可用。
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;
};
答案 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。