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
不是这里的问题。-1
private
没有问题。缺少类的名称是一个技术问题。getter存在设计问题。是否有逻辑解释允许对私有类型进行此类访问?。。封装呢?