l********a 发帖数: 1154 | 1 c++的,新手
做了个类,类内部外部定义的格式大家就别看了,目前主要是问问流程问题
因为这个类我是递归初始化的,所以有一个构造器是接受一个Test *parent
class Test
{
Test *parent;
list children;
...
// 递归子构造函数
Test(Test *parent) // 构造器,接收一个Test指针,所有子构造器构造出的对象
的父节点
{
...
this->parent = parent; // 这里不知道为什么没有初始化好
for (循环)
{
this->children.push_back(Test(this));
...
}
// 主构造函数,解析文件内容构造
Test(string &fname) // 构造器,接收一个文件名
{
...
this->parent = NULL;
Test(this); // 调用递归子构造函数,这里好像没有将this传递给上面的构
造器
...
}
};
大概问题就是这样,是不是因为在递归构造的时候,每一个this都是等到子节点构造完
了才返回,这时候this才有意义,所以Test(this)传递过去的this是个空的?
那对这种父子节点互相引用的关系,应该怎么初始化?
欢迎大家指导。 |
p***o 发帖数: 1252 | 2
^^^^^^^^^^OK
^^^^^^^^^^Wrong
These two expressions must mean the same thing to the compiler
while you expect them to be different.
【在 l********a 的大作中提到】 : c++的,新手 : 做了个类,类内部外部定义的格式大家就别看了,目前主要是问问流程问题 : 因为这个类我是递归初始化的,所以有一个构造器是接受一个Test *parent : class Test : { : Test *parent; : list children; : ... : // 递归子构造函数 : Test(Test *parent) // 构造器,接收一个Test指针,所有子构造器构造出的对象
|
t****t 发帖数: 6806 | 3 when you push_back to list, you are doing a copy. the lower level
object is pointing to the original object, while after copy, it's lost.
if you use pointer to object, be careful of possible copy. you may simply
disable it (Test::Test(const&) = delete) to catch errors.
【在 l********a 的大作中提到】 : c++的,新手 : 做了个类,类内部外部定义的格式大家就别看了,目前主要是问问流程问题 : 因为这个类我是递归初始化的,所以有一个构造器是接受一个Test *parent : class Test : { : Test *parent; : list children; : ... : // 递归子构造函数 : Test(Test *parent) // 构造器,接收一个Test指针,所有子构造器构造出的对象
|
X****r 发帖数: 3557 | 4 Test(this);并没有调用同一个对象的另一个构造函数,它创建了一个新的临时对象。
你不能在一个构造函数里调用另一个构造函数。把共同的部分提出来成为一个新函数,
让两个构造函数都调用它。
【在 l********a 的大作中提到】 : c++的,新手 : 做了个类,类内部外部定义的格式大家就别看了,目前主要是问问流程问题 : 因为这个类我是递归初始化的,所以有一个构造器是接受一个Test *parent : class Test : { : Test *parent; : list children; : ... : // 递归子构造函数 : Test(Test *parent) // 构造器,接收一个Test指针,所有子构造器构造出的对象
|
t****t 发帖数: 6806 | 5 我想他要的就是这个吧.
【在 X****r 的大作中提到】 : Test(this);并没有调用同一个对象的另一个构造函数,它创建了一个新的临时对象。 : 你不能在一个构造函数里调用另一个构造函数。把共同的部分提出来成为一个新函数, : 让两个构造函数都调用它。
|
X****r 发帖数: 3557 | 6 我指的是下面那个构造函数里的Test(this);
楼主应该不是想要创建一个不用的临时对象吧。
【在 t****t 的大作中提到】 : 我想他要的就是这个吧.
|
t****t 发帖数: 6806 | 7 哦, 对. 我以为他的意思是new Test(this), 不过显然我理解错了...不过上面那个也
不对.
【在 X****r 的大作中提到】 : 我指的是下面那个构造函数里的Test(this); : 楼主应该不是想要创建一个不用的临时对象吧。
|
X****r 发帖数: 3557 | 8 C++太复杂陷阱太多,还是学别的语言入门好。
【在 t****t 的大作中提到】 : 哦, 对. 我以为他的意思是new Test(this), 不过显然我理解错了...不过上面那个也 : 不对.
|
l********a 发帖数: 1154 | 9
那我的递归定义怎么提出来呢?
其实是需要做个类,有个孩子数组,还有个父亲指针,
初始化的时候,如果传入了字符串s,我就调用一个构造函数a来初始化一个对象o,此
时,o的父亲等于null,o的孩子是把传入的字符串截取一部分(ss),连同自身,传给
另一个构造函数b。
由于b的参数有个指向o的zhizhen,我就想把所有b构造出来的孩子的父亲指针指向传入
的参数o,然后截取字符串加上自身(这已经不是o了,而是o的孩子)递归调用,直到
字符串长度为1。
这样构造完成时,会形成一个串,有点儿像html文件的结构组织.不知道这样说清楚了
吗?对这样的问题,不递归初始化,还有其他办法吗?
o
|-oc1
|-occ1
| |-occc1
| |-...
|-occ2
|-...
|-...
【在 X****r 的大作中提到】 : Test(this);并没有调用同一个对象的另一个构造函数,它创建了一个新的临时对象。 : 你不能在一个构造函数里调用另一个构造函数。把共同的部分提出来成为一个新函数, : 让两个构造函数都调用它。
|
t****t 发帖数: 6806 | 10 你的目的没问题, 递归也差不多, 就是xentar说的, ctor里不能调用*本对象的*另一个
ctor. 你可以调用ctor来生成另一个对象, 这没问题. 但是你不能从一个ctor里复用另
一个ctor的代码. 所以xentar说, 你把公用代码放在一个普通成员里, 从多个ctor调用
这个普通成员是可以的.
【在 l********a 的大作中提到】 : : 那我的递归定义怎么提出来呢? : 其实是需要做个类,有个孩子数组,还有个父亲指针, : 初始化的时候,如果传入了字符串s,我就调用一个构造函数a来初始化一个对象o,此 : 时,o的父亲等于null,o的孩子是把传入的字符串截取一部分(ss),连同自身,传给 : 另一个构造函数b。 : 由于b的参数有个指向o的zhizhen,我就想把所有b构造出来的孩子的父亲指针指向传入 : 的参数o,然后截取字符串加上自身(这已经不是o了,而是o的孩子)递归调用,直到 : 字符串长度为1。 : 这样构造完成时,会形成一个串,有点儿像html文件的结构组织.不知道这样说清楚了
|
|
|
p***o 发帖数: 1252 | 11 这也不算陷阱, 至少在这个问题上C++本身的语义是一致的,而他没意识到自己
写了两次Test(this)的目的不一样。
【在 X****r 的大作中提到】 : C++太复杂陷阱太多,还是学别的语言入门好。
|
l********a 发帖数: 1154 | 12
的确卡在这儿了,我就想在初始化的时候,让自己的孩子能得到自身这个对象的指针,从
而设置所有孩子的this->parent值
目前看不出哪里有公用的代码啊?能把哪部分踢出去做一个公共函数?
有了公用函数还是无法解决将自身指针传递过去的问题啊?
再次请教
【在 p***o 的大作中提到】 : 这也不算陷阱, 至少在这个问题上C++本身的语义是一致的,而他没意识到自己 : 写了两次Test(this)的目的不一样。
|
t****t 发帖数: 6806 | 13 我觉得你是看不懂中文, 不是不会写C++.
【在 l********a 的大作中提到】 : : 的确卡在这儿了,我就想在初始化的时候,让自己的孩子能得到自身这个对象的指针,从 : 而设置所有孩子的this->parent值 : 目前看不出哪里有公用的代码啊?能把哪部分踢出去做一个公共函数? : 有了公用函数还是无法解决将自身指针传递过去的问题啊? : 再次请教
|
p***o 发帖数: 1252 | 14 你这 ... 他明显是没明白递归,而且也没明白你前面提到的vector存值的问题,
于是搞不出来。
【在 t****t 的大作中提到】 : 我觉得你是看不懂中文, 不是不会写C++.
|
t****t 发帖数: 6806 | 15 他一直在反反复复的说不能把this传过去, 所有的人都跟他说问题在别的地方, 他当作
没看见, 我只能认为他看不懂中文了
【在 p***o 的大作中提到】 : 你这 ... 他明显是没明白递归,而且也没明白你前面提到的vector存值的问题, : 于是搞不出来。
|
p***o 发帖数: 1252 | 16 这样:
class Test
{
typedef std::shared_ptr Test_ptr;
Test *parent_;
std::vector children_;
Test(Test *parent) : parent_(parent) {
make_node();
create_children();
}
Test(string) : parent_(0) {
make_root();
create_children();
}
void create_children() {
for (...) {
children_.push_back(Test_ptr(new Test(this)));
}
}
};
【在 l********a 的大作中提到】 : : 的确卡在这儿了,我就想在初始化的时候,让自己的孩子能得到自身这个对象的指针,从 : 而设置所有孩子的this->parent值 : 目前看不出哪里有公用的代码啊?能把哪部分踢出去做一个公共函数? : 有了公用函数还是无法解决将自身指针传递过去的问题啊? : 再次请教
|
p***o 发帖数: 1252 | 17 我估计他试着改过,但那两个东西得一起改,新手能同时改对的可能性几乎为0。
【在 t****t 的大作中提到】 : 他一直在反反复复的说不能把this传过去, 所有的人都跟他说问题在别的地方, 他当作 : 没看见, 我只能认为他看不懂中文了
|
l********a 发帖数: 1154 | 18 非常感谢,
shared_ptr这个好像是c++11的新特性吗?我的vs2008提示有问题,include了memory还是
找不到.
另外Test(Test *parent) : parent_(parent)
{
...这种语法我还不大了解,冒号后面的parent是啥意思?继续学习c++
}
我继续debug
【在 p***o 的大作中提到】 : 这样: : class Test : { : typedef std::shared_ptr Test_ptr; : Test *parent_; : std::vector children_; : Test(Test *parent) : parent_(parent) { : make_node(); : create_children(); : }
|
h*******s 发帖数: 8454 | 19 intialization list
这个挺基础的。。。
shared_ptr 原来是boost里的,现在进11了
【在 l********a 的大作中提到】 : 非常感谢, : shared_ptr这个好像是c++11的新特性吗?我的vs2008提示有问题,include了memory还是 : 找不到. : 另外Test(Test *parent) : parent_(parent) : { : ...这种语法我还不大了解,冒号后面的parent是啥意思?继续学习c++ : } : 我继续debug
|
l********a 发帖数: 1154 | 20 update:
去其他论坛问了一下,不到5分钟有人指出一个问题,好像解决了
就是把children不要定义为 list《Test》而是定义为list《Test*》,
然后构造函数里面给当前对象push_back时候使用new Test(this)就行了
暂时测试多层结构还有些问题,可能是代码改来改去改乱了,但是第一层的children利
用指针获得-〉parent是正确的 |
|
|
t****t 发帖数: 6806 | 21 你要是抬头看我回的贴, 我一开始就说了这个问题, 你视而不见
你要是仔细读pptwo的代码, 你会发现他写的也是new Test(this), 不过他用shared_
ptr代替了Test*
所以你什么新信息都没得到
【在 l********a 的大作中提到】 : update: : 去其他论坛问了一下,不到5分钟有人指出一个问题,好像解决了 : 就是把children不要定义为 list《Test》而是定义为list《Test*》, : 然后构造函数里面给当前对象push_back时候使用new Test(this)就行了 : 暂时测试多层结构还有些问题,可能是代码改来改去改乱了,但是第一层的children利 : 用指针获得-〉parent是正确的
|
b***i 发帖数: 3043 | 22 你还是没有完全理解。你还没有区分 "呼叫构造函数" 和 "生成类的实例"
Test(this);是呼叫构造函数
Test *a=new Test(this); 或者 Test temp(this);是生成类的实例。
你原来写的是呼叫构造函数,那怎么行呢?
【在 l********a 的大作中提到】 : update: : 去其他论坛问了一下,不到5分钟有人指出一个问题,好像解决了 : 就是把children不要定义为 list《Test》而是定义为list《Test*》, : 然后构造函数里面给当前对象push_back时候使用new Test(this)就行了 : 暂时测试多层结构还有些问题,可能是代码改来改去改乱了,但是第一层的children利 : 用指针获得-〉parent是正确的
|
t****t 发帖数: 6806 | 23 actually "Test(this)" also generate an object of Test, but as a temporary
object it's destroyed right away.
【在 b***i 的大作中提到】 : 你还是没有完全理解。你还没有区分 "呼叫构造函数" 和 "生成类的实例" : Test(this);是呼叫构造函数 : Test *a=new Test(this); 或者 Test temp(this);是生成类的实例。 : 你原来写的是呼叫构造函数,那怎么行呢?
|
l********a 发帖数: 1154 | 24 现在完全理解了,呵呵.多谢几位指导.
虽然写了不少代码,但是经常乱写,只求代码能work,就不想很多
还有一个迷思:
Test test(...)和Test *test = new Test(...)
都会生成Test类的一个对象,难道区别只在于引用内部变量和方法时使用点还是->的区
别吗?还有其他要注意的地方吗?
Test *test是用完必须自己释放吗?
【在 t****t 的大作中提到】 : actually "Test(this)" also generate an object of Test, but as a temporary : object it's destroyed right away.
|
b***i 发帖数: 3043 | 25 一个在栈上,一个在堆上,还可以用static生成静态变量。
代码就是写,调试,就理解了。
【在 l********a 的大作中提到】 : 现在完全理解了,呵呵.多谢几位指导. : 虽然写了不少代码,但是经常乱写,只求代码能work,就不想很多 : 还有一个迷思: : Test test(...)和Test *test = new Test(...) : 都会生成Test类的一个对象,难道区别只在于引用内部变量和方法时使用点还是->的区 : 别吗?还有其他要注意的地方吗? : Test *test是用完必须自己释放吗?
|