C++ C++;:公开和私下申报的顺序
我不确定我班上申报的顺序。我的编译器说C++ C++;:公开和私下申报的顺序,c++,C++,我不确定我班上申报的顺序。我的编译器说错误:“Foo”未在此范围内声明。如果我更改类的public和private部分的顺序,则会出现相同的错误。另外,如果我想使用getFoo(),并且包含头文件,则struct Foo类型不可见,因为它是私有的。但是如果我把它再次放在公共范围内,那么public必须在private之前,因为否则类型为Foo的myFoo的声明不能发生,因为Foo还没有标记。 我在这里很困惑。。。谢谢你的帮助 /*MyClass.h*/ class MyClass { pr
错误:“Foo”未在此范围内声明。如果我更改类的public
和private
部分的顺序,则会出现相同的错误。另外,如果我想使用getFoo()
,并且包含头文件,则struct Foo类型不可见,因为它是私有的。但是如果我把它再次放在公共范围内,那么public必须在private之前,因为否则类型为Foo
的myFoo
的声明不能发生,因为Foo
还没有标记。
我在这里很困惑。。。谢谢你的帮助
/*MyClass.h*/
class MyClass
{
private:
struct Foo{
int bar;
};
Foo myFoo;
public:
Foo getFoo(){ return myFoo;}
};
您的结构Foo应该是公共的,否则getFoo getter将无法工作,因为Foo只能在类内部访问它与公共或私有无关。必须先定义内部类型,然后才能使用:
struct Foo
{
Bar bar() { return Bar(); } // ERROR
struct Bar {};
};
struct Foo
{
struct Bar {};
Bar bar() { return Bar(); } // OK
};
注意:对于私有
类型的可访问性存在一些混淆。该类型可以在其类之外访问,只是无法命名。因此,访问私有类型的代码是完全合法的:
class Foo
{
struct Bar {
void do_stuff() const {}
};
public:
Bar bar() { return Bar(); } // OK
};
int main()
{
Foo f;
f.bar().do_stuff(); // use temporary Bar object
// In C++11, you can even make a named instance
auto b = f.bar(); // instantiate a Bar object called b
b.do_stuff(); // use it
}
为什么您的类没有名称请显示一些复制错误的完整代码。你所展示的没有什么不对。请参阅。@juanchopanza:says g++,“foo.cpp:2:1:错误:匿名结构不能有函数成员”-1,用于编辑答案后的问题文本和发布垃圾before@juanchopanza:抱歉他:)@TonyD但是auto f=x.getFoo()代码>将起作用。private
不是这里的问题。-1private
没有问题。缺少类的名称是一个技术问题。getter存在设计问题。是否有逻辑解释允许对私有类型进行此类访问?。。封装呢?