C ++中类的类的语法

时间:2011-03-16 15:33:44

标签: c++ syntax

如果我有以下

class A
    {
    public:
        int stuff;
            void helper(B temp, int d); //what about here? I'm getting a 'B' has not been declared error here.
    private:
        class B 
        {
        public:
            int stuffer;
        private:
            int x;
        };
    }:

在我的实现文件中引用第2类的正确方法是什么?可不可能是 1::2::someMethod?或2::someMethod

5 个答案:

答案 0 :(得分:3)

假设1和2引用REAL类名,1::2::methodName就像任何其他嵌套作用域一样。

答案 1 :(得分:1)

首先,类名不能以整数开头。所以重命名它们:

 class A
 {
    public:
        int stuff;
    private:
        class B 
        {
        public:
            int stuffer;
        private:
            int x;
        };
  };

其次,由于嵌套类B位于私有部分,因此您无法从类A范围之外访问它。 B只能访问A。声明类型为B的对象的语法在B bObj;范围内为A

现在你应该先问自己,然后再提出进一步的问题!


至于你的编辑(增加的问题):它没有编译因为到编译器看到B temp时,它还没有看到B的定义,这就是为什么它没有声明B

修复非常简单。在使用之前声明B,如下所示:

class A
{
private:
        class B 
        {
        public:
            int stuffer;
        private:
            int x;
        };
    public:
        int stuff;
        void helper(B temp, int d);

 }; //<--- this is also fixed. your code has 'colon', instead semi-colon!

同时阅读课程结束时的评论!

答案 2 :(得分:1)

如果你在1级方法中,你可以使用2 :: somemethod。在其他地方,使用1 :: 2 :: somemethod。 “Inside”包括类1的方法实现中的方法参数声明,但不包括类1的方法实现的返回值声明。

答案 3 :(得分:0)

这取决于您所处的范围级别。在类1的成员函数内,它将是class_2::someMethod。在文件范围内,它将是class_1::class_2::someMethod。完全限定像这样的函数或变量名称总是正确的,但有时它的输入比严格必要的更多。通常,当编译器无法自行确定您所指的内容时,您需要范围解析运算符::

在实践中,最好的方法是尝试并看看会发生什么。如果编译器给你一个错误,请在它前面抛出类名,然后再试一次。

答案 4 :(得分:0)

嵌套类的语法:

Class class_name1
{  
    Private:
        Data members
    Public: 
        Member functions
        {
        .........
        }
        Class class_name2  //class2 is embedded with class1
        {
            Private:
                Data members
            Public: 
                Member functions
                {
                .........
                }
        };  // class2
};  //class1

嵌套类可以在另一个类中定义一个类,因为类声明可以定义范围。

嵌套类仅在封闭类的范围内有效。

几乎不存在嵌套类的需要。