该类私有成员为该类定义的问题

夜月岛 2010-08-25 09:35:41
class test
{
private:
test *n1;
};
int main()
{
return 0;
}//正确




class test
{
private:
test n1;
};
int main()
{
return 0;
}//错误




那么该类一旦定义一个对象难道就不会无节制地构造?
...全文
198 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2010-08-26
  • 打赏
  • 举报
回复
有个概念叫“不完整类型”。
error: field ‘i’ has incomplete type
从错误消息中就能看出来。
http://msdn.microsoft.com/en-us/library/200xfxh6.aspx
夜月岛 2010-08-26
  • 打赏
  • 举报
回复
大家加油学习吧
夜月岛 2010-08-26
  • 打赏
  • 举报
回复
谢谢大家的帮助了
meisizhaosi 2010-08-25
  • 打赏
  • 举报
回复
请看C++ PRIMER
herman~~ 2010-08-25
  • 打赏
  • 举报
回复
编译器 无法确定类的大小
rig622 2010-08-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 qyjohn 的回复:]

看来那个私有成员指针可以无限调用自己忽?
[/Quote]

不是的,在C++中,类的指针 ClassA* p= new ClassA;只有写成这样了才初始化类ClassA,也就是楼主所说自己的类test。写成这样ClassA* p,只分配一个指针地址空间,没有对类ClassA做初始化。
夜月岛 2010-08-25
  • 打赏
  • 举报
回复
看来那个私有成员指针可以无限调用自己忽?
rig622 2010-08-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 qyjohn 的回复:]
C/C++ code
class test
{
private:
test *n1;
};
int main()
{
return 0;
}//正确




C/C++ code

class test
{
private:
test n1;
};
int main()
{
return 0;
}//错误

那么该类一旦定义……
[/Quote]

类在声明的对象时候,声明类的对象和声明类的指针是有差别的。声明类的对象的时候,会自动调用构造函数,初始化类对象,声明类的指针的时候,必须new后,才调用构造函数,初始化类对象。

test *n1; 第一个声明test类指针,没有调用构造函数和初始化类对象。
test n1; 第二个声明test类对象,自动调用构造函数和初始化类对象。

这个两个声明是在 test本身类中,第二个在初始化类对象的时候会无限循环初始化,所以编译器会默认报错。
而第一个,只声明了一个指针,没有初始化类的过程。所以不会报错。
cxxer 2010-08-25
  • 打赏
  • 举报
回复
class不能参嵌套定义,class未定义结束时,不能引用class本身。
xy_zhang 2010-08-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qyjohn 的回复:]

仍然无法理解,算了,过一阵子应该能再明白点吧。。。
[/Quote]

你想,假如这是允许的,那么test类对象里面有一个test类对象n1,这个n1里面也应该还有一个test类对象n1,n1复n1,会如此无限自我循环下去。
夜月岛 2010-08-25
  • 打赏
  • 举报
回复
C:\DOCUME~1\John\MYDOCU~1\test\new.cpp:16: error: `new' cannot appear in a constant-expression

C:\DOCUME~1\John\MYDOCU~1\test\new.cpp:16: error: ISO C++ forbids initialization of member `n1'

C:\DOCUME~1\John\MYDOCU~1\test\new.cpp:16: error: making `n1' static

C:\DOCUME~1\John\MYDOCU~1\test\new.cpp:16: error: invalid in-class initialization of static data member of non-integral type `newtest*'
出现四个错误
夜月岛 2010-08-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sunpy11 的回复:]

[code=C/C++]#include<iostream>
using std::cout;
using std::endl;

class newtest
{
public:
newtest()
{
cout<<"go"<<endl;
}
};
class test
{
private:
……
[/Quote]
Sunpy11 2010-08-25
  • 打赏
  • 举报
回复
[code=C/C++]#include<iostream>
using std::cout;
using std::endl;

class newtest
{
public:
newtest()
{
cout<<"go"<<endl;
}
};
class test
{
private:
newtest *n1;
};
int main()
{
test n2;
while(1){}
return 0;
}
//不会显示go
[/code
我觉得这个例子中是因为newtest *n1 只声明没有定义,所以没有显示go,如果加上 n1 = new newtest()就可以了
lovestefanie 2010-08-25
  • 打赏
  • 举报
回复
例如你要计算一个箱子的大小,这个箱子的大小又包括一个另一个一模一样的箱子,这样就循环了,所以编译器就不鸟了
夜月岛 2010-08-25
  • 打赏
  • 举报
回复
仍然无法理解,算了,过一阵子应该能再明白点吧。。。
Polyglot_g 2010-08-25
  • 打赏
  • 举报
回复
学习中

lovestefanie 2010-08-25
  • 打赏
  • 举报
回复
学习了
jizhongqing 2010-08-25
  • 打赏
  • 举报
回复
c里面就有这个问题,结构体不能嵌套定义

struct A
{
struct A a; //编译器翻译这句时需要知道A的大小,而此时A还没翻译完,无法知道大小,所以不可以这样定义
}

struct A
{
struct A * a; //指针的大小是知道的,所以编译器可以继续向下翻译
}
夜月岛 2010-08-25
  • 打赏
  • 举报
回复

#include<iostream>
using std::cout;
using std::endl;

class newtest
{
public:
newtest()
{
cout<<"go"<<endl;
}
};
class test
{
private:
newtest n1;
};
int main()
{
test n2;
while(1){}
return 0;
}
//会显示go



#include<iostream>
using std::cout;
using std::endl;

class newtest
{
public:
newtest()
{
cout<<"go"<<endl;
}
};
class test
{
private:
newtest *n1;
};
int main()
{
test n2;
while(1){}
return 0;
}
//不会显示go
xy_zhang 2010-08-25
  • 打赏
  • 举报
回复
当类test定义未结束的时候,编译器并不知道test有多大(占多少字节)。因此直接定义test对象是非法的。而指针的大小是固定的,一般总是32-bit或者64-bit。

64,675

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧