由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - c++类未完成初始化,如何引用this?
相关主题
simple question on C++ initialization list还没被劝退C++的都来看看这个吧
C++的"初始化"小结没有经过构造函数???
关于构造函数的一道测试题 (转载)一道Microsoft的面试题
[c++] 关于构造函数的一个小问题不明白C++的一个地方
请教c++数组初始化[合集] C++的弱问题
初始化列表问题Initialization list的一个问题
突然想到一个老题,构造函数n多变量初始化问行C++代码
C++构造函数的问题糊涂了,请问一个对象访问的基本问题
相关话题的讨论汇总
话题: test话题: parent话题: 构造函数话题: 构造话题: 初始化
进入Programming版参与讨论
1 (共1页)
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文件的结构组织.不知道这样说清楚了

相关主题
初始化列表问题还没被劝退C++的都来看看这个吧
突然想到一个老题,构造函数n多变量初始化没有经过构造函数???
C++构造函数的问题一道Microsoft的面试题
进入Programming版参与讨论
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是正确的
相关主题
不明白C++的一个地方问行C++代码
[合集] C++的弱问题糊涂了,请问一个对象访问的基本问题
Initialization list的一个问题[合集] 关于构造函数
进入Programming版参与讨论
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是用完必须自己释放吗?

1 (共1页)
进入Programming版参与讨论
相关主题
糊涂了,请问一个对象访问的基本问题请教c++数组初始化
[合集] 关于构造函数初始化列表问题
为啥gcc找不到类的构造函数?突然想到一个老题,构造函数n多变量初始化
构造函数里的异常处理C++构造函数的问题
simple question on C++ initialization list还没被劝退C++的都来看看这个吧
C++的"初始化"小结没有经过构造函数???
关于构造函数的一道测试题 (转载)一道Microsoft的面试题
[c++] 关于构造函数的一个小问题不明白C++的一个地方
相关话题的讨论汇总
话题: test话题: parent话题: 构造函数话题: 构造话题: 初始化