如果我有以下
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
?
答案 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
嵌套类可以在另一个类中定义一个类,因为类声明可以定义范围。
嵌套类仅在封闭类的范围内有效。
几乎不存在嵌套类的需要。