C++ C++;,InnerClass以及为什么只能创建成员作为指向它们的指针
为什么您只能创建一个内部类的pionter作为封闭类的成员。 它在记忆中是如何排列的,为什么它会阻止这种情况发生,例如:C++ C++;,InnerClass以及为什么只能创建成员作为指向它们的指针,c++,inner-classes,C++,Inner Classes,为什么您只能创建一个内部类的pionter作为封闭类的成员。 它在记忆中是如何排列的,为什么它会阻止这种情况发生,例如: class temp { public: class inner { public: inner(int a = 0) : memberInt(a) {} const int memberInt; }; temp(int i = 0) : member(i) {
class temp
{
public:
class inner
{
public:
inner(int a = 0) : memberInt(a) {}
const int memberInt;
};
temp(int i = 0) : member(i)
{
}
inner *i; // this works
inner i; // this doesn't
int member;
};
提前感谢:-)。假设我将第二个代码(内部I)重命名为内部i2,那么上面的代码在g++中对我来说编译得很好 这正是我用g++编译的代码:
class temp
{
public:
class inner
{
public:
inner(int a = 0) : memberInt(a) {}
const int memberInt;
};
temp(int i = 0) : member(i)
{
}
inner *i;
inner i2;
int member;
};
int main()
{
return 0;
}
你的前提是
内在的i代码>无效或不正确。均internal*i代码>和内部i代码>是temp
中成员变量的有效声明。编译器拒绝的内部i代码>?[在一个不相关的注释中,最好把它称为C++中的嵌套类,以避免与java中的内部类混淆,这是完全不同的。]我确信这是完全合法的,已经使用了很多次。我能理解为什么它不合法的唯一原因是如果你在内部类之前声明了成员——你仍然可以让指针与前向声明一起工作。我在这里看到的唯一“非法”的事情是,他在temp类中有两个名为“I”的标识符。我没有同时编写这两个标识符,它不可能是一个名字密码,那么要么(a)你发布的代码与你遇到这个问题的代码不同(很可能),要么(b)你发现了一个编译器错误(可能性很小)。我的工作原理与你的一样,但在我的源代码中有一点不同,那就是我向i2对象的构造函数传递了参数,这确实给了我错误,为什么?感谢你:- SRY愚蠢的问题,我应该通过Timp X的构造函数(@ RubisiBuc:你能发布给你一个错误的确切代码吗?我刚刚回到C++中,大约10年过去了。”迈克,我做了一些类似于I I(4)的事情,但是到目前为止,我的经验不足使我误认为这是不恰当的。