我的一个程序在构造函数中使用了this指针,编译器抱警告。虽然运行了一段时间并未发生错误,但心中总是不安。希望有高人指点。
代码大概像这样:
class MyClass
{
public:
MyClass():_pMyClass(this){}
private:
MyClass *_pMyClass;
};
16 个解决方案
#1
您为什么要设计一个MyClass *呢?
#2
在对象没有被完全被构造出来出前,最好不要用this指针。因此只有构造函数执行完后,对象才是完整的。这个代码逻辑上是错的,
#3
因为是在构造函数的初始化列表中,
此时this对象还没有完全形成,所以会有警告。
不过如果只是看上面的代码是没有问题的。
此时this对象还没有完全形成,所以会有警告。
不过如果只是看上面的代码是没有问题的。
#4
你这叫什么你懂吗
这叫多此一举
它系统本身就默认了一个this指针
你干吗还要再搞一个`
这叫多此一举
它系统本身就默认了一个this指针
你干吗还要再搞一个`
#5
to:vcchunhong(願意偽祢)
它只不过是初始化成this,可能在程序中还要付给别的MyClass指针。
构造函数中使用this,在理论上是容许的。虽然this还没有构造好,
但此时编译器会默认构造此对象。
它只不过是初始化成this,可能在程序中还要付给别的MyClass指针。
构造函数中使用this,在理论上是容许的。虽然this还没有构造好,
但此时编译器会默认构造此对象。
#6
class MyClass
{
public:
MyClass():_pMyClass(this){}
private:
MyClass *_pMyClass;
};
对象没有被完全被构造出来出前,最好不要用this指针。因此只有构造函数执行完后,对象才是完整的。这个代码逻辑上是错的,
之所以运行的正确的,是因为你的每个对象实体都创建成功了!
我想你是在实现链表的时候这样做的!
{
public:
MyClass():_pMyClass(this){}
private:
MyClass *_pMyClass;
};
对象没有被完全被构造出来出前,最好不要用this指针。因此只有构造函数执行完后,对象才是完整的。这个代码逻辑上是错的,
之所以运行的正确的,是因为你的每个对象实体都创建成功了!
我想你是在实现链表的时候这样做的!
#7
找到篇文章,希望有帮助。
http://hqtech.nease.net/articles/VC_ConstructorThis.htm
http://hqtech.nease.net/articles/VC_ConstructorThis.htm
#8
应该说this指向的地址是正确的,但是有可能无法正确访问它的成员
#9
同意julyclyde的说法
#10
谢谢 willcheng() (^^) 信誉的文章(愿你早日升星)。
我觉得应该把我的问题更具体一些会。我想实现一个这样的功能:默认情况下MyClass *_pMyClass指向自身,但在以后可能会设置为指向其他的MyClass。起初我想将_pMyClass
初始为0,这样需要一步判断。
希望高人们谈谈你们的想法。
我觉得应该把我的问题更具体一些会。我想实现一个这样的功能:默认情况下MyClass *_pMyClass指向自身,但在以后可能会设置为指向其他的MyClass。起初我想将_pMyClass
初始为0,这样需要一步判断。
希望高人们谈谈你们的想法。
#11
你把初始化放在函数体中看会不会有警告。应该不会有问题。
#12
....
起初我想将_pMyClass
初始为0,这样需要一步判断。
....
指向自身的时候你也用不到它阿,不如你的判断语句都改为
_pMyClass != this
这种形式
起初我想将_pMyClass
初始为0,这样需要一步判断。
....
指向自身的时候你也用不到它阿,不如你的判断语句都改为
_pMyClass != this
这种形式
#13
class MyClass
{
public:
MyClass():_pMyClass(this){}
private:
MyClass *_pMyClass;
};
上面的代码好像不太好吧,改成:
class MyClass
{
public:
MyClass():{_pMyClass = this;}
private:
MyClass *_pMyClass;
};
在构造函数中,使用this指针应当有限制:就是不要访问this对象的函数和变量(包括所有被调用函数内部也不要访问this对象的函数和变量),仅仅作为一个地址来传递和赋值是安全的。
{
public:
MyClass():_pMyClass(this){}
private:
MyClass *_pMyClass;
};
上面的代码好像不太好吧,改成:
class MyClass
{
public:
MyClass():{_pMyClass = this;}
private:
MyClass *_pMyClass;
};
在构造函数中,使用this指针应当有限制:就是不要访问this对象的函数和变量(包括所有被调用函数内部也不要访问this对象的函数和变量),仅仅作为一个地址来传递和赋值是安全的。
#14
不错~
#15
class MyClass
{
public:
MyClass(){
_pMyClass = this;
}
private:
MyClass *_pMyClass;
};
就没有问题了,
MyClass():_pMyClass(this){}不好是因为用到了缺省的拷贝构造函数,也许有风险,因此警告。
{
public:
MyClass(){
_pMyClass = this;
}
private:
MyClass *_pMyClass;
};
就没有问题了,
MyClass():_pMyClass(this){}不好是因为用到了缺省的拷贝构造函数,也许有风险,因此警告。
#16
类中的数据地址是在编译时就已经具有的了,也就是偏移量,下面举个例子,下面的例子都是假设在构造函数中执行的。
正确例子:
MyClass *p = new MyClass();
错误例子:
MyClass *p = new MyClassExtended(); // 假设MyClassExtended是MyClass的子类,这时属于MyClassExtended的数据还没有准备好,因为构造函数是从基类开始构造的,此时访问MyClassExtended扩展的数据就是错误的。
正确例子:
MyClass *p = new MyClass();
错误例子:
MyClass *p = new MyClassExtended(); // 假设MyClassExtended是MyClass的子类,这时属于MyClassExtended的数据还没有准备好,因为构造函数是从基类开始构造的,此时访问MyClassExtended扩展的数据就是错误的。
#1
您为什么要设计一个MyClass *呢?
#2
在对象没有被完全被构造出来出前,最好不要用this指针。因此只有构造函数执行完后,对象才是完整的。这个代码逻辑上是错的,
#3
因为是在构造函数的初始化列表中,
此时this对象还没有完全形成,所以会有警告。
不过如果只是看上面的代码是没有问题的。
此时this对象还没有完全形成,所以会有警告。
不过如果只是看上面的代码是没有问题的。
#4
你这叫什么你懂吗
这叫多此一举
它系统本身就默认了一个this指针
你干吗还要再搞一个`
这叫多此一举
它系统本身就默认了一个this指针
你干吗还要再搞一个`
#5
to:vcchunhong(願意偽祢)
它只不过是初始化成this,可能在程序中还要付给别的MyClass指针。
构造函数中使用this,在理论上是容许的。虽然this还没有构造好,
但此时编译器会默认构造此对象。
它只不过是初始化成this,可能在程序中还要付给别的MyClass指针。
构造函数中使用this,在理论上是容许的。虽然this还没有构造好,
但此时编译器会默认构造此对象。
#6
class MyClass
{
public:
MyClass():_pMyClass(this){}
private:
MyClass *_pMyClass;
};
对象没有被完全被构造出来出前,最好不要用this指针。因此只有构造函数执行完后,对象才是完整的。这个代码逻辑上是错的,
之所以运行的正确的,是因为你的每个对象实体都创建成功了!
我想你是在实现链表的时候这样做的!
{
public:
MyClass():_pMyClass(this){}
private:
MyClass *_pMyClass;
};
对象没有被完全被构造出来出前,最好不要用this指针。因此只有构造函数执行完后,对象才是完整的。这个代码逻辑上是错的,
之所以运行的正确的,是因为你的每个对象实体都创建成功了!
我想你是在实现链表的时候这样做的!
#7
找到篇文章,希望有帮助。
http://hqtech.nease.net/articles/VC_ConstructorThis.htm
http://hqtech.nease.net/articles/VC_ConstructorThis.htm
#8
应该说this指向的地址是正确的,但是有可能无法正确访问它的成员
#9
同意julyclyde的说法
#10
谢谢 willcheng() (^^) 信誉的文章(愿你早日升星)。
我觉得应该把我的问题更具体一些会。我想实现一个这样的功能:默认情况下MyClass *_pMyClass指向自身,但在以后可能会设置为指向其他的MyClass。起初我想将_pMyClass
初始为0,这样需要一步判断。
希望高人们谈谈你们的想法。
我觉得应该把我的问题更具体一些会。我想实现一个这样的功能:默认情况下MyClass *_pMyClass指向自身,但在以后可能会设置为指向其他的MyClass。起初我想将_pMyClass
初始为0,这样需要一步判断。
希望高人们谈谈你们的想法。
#11
你把初始化放在函数体中看会不会有警告。应该不会有问题。
#12
....
起初我想将_pMyClass
初始为0,这样需要一步判断。
....
指向自身的时候你也用不到它阿,不如你的判断语句都改为
_pMyClass != this
这种形式
起初我想将_pMyClass
初始为0,这样需要一步判断。
....
指向自身的时候你也用不到它阿,不如你的判断语句都改为
_pMyClass != this
这种形式
#13
class MyClass
{
public:
MyClass():_pMyClass(this){}
private:
MyClass *_pMyClass;
};
上面的代码好像不太好吧,改成:
class MyClass
{
public:
MyClass():{_pMyClass = this;}
private:
MyClass *_pMyClass;
};
在构造函数中,使用this指针应当有限制:就是不要访问this对象的函数和变量(包括所有被调用函数内部也不要访问this对象的函数和变量),仅仅作为一个地址来传递和赋值是安全的。
{
public:
MyClass():_pMyClass(this){}
private:
MyClass *_pMyClass;
};
上面的代码好像不太好吧,改成:
class MyClass
{
public:
MyClass():{_pMyClass = this;}
private:
MyClass *_pMyClass;
};
在构造函数中,使用this指针应当有限制:就是不要访问this对象的函数和变量(包括所有被调用函数内部也不要访问this对象的函数和变量),仅仅作为一个地址来传递和赋值是安全的。
#14
不错~
#15
class MyClass
{
public:
MyClass(){
_pMyClass = this;
}
private:
MyClass *_pMyClass;
};
就没有问题了,
MyClass():_pMyClass(this){}不好是因为用到了缺省的拷贝构造函数,也许有风险,因此警告。
{
public:
MyClass(){
_pMyClass = this;
}
private:
MyClass *_pMyClass;
};
就没有问题了,
MyClass():_pMyClass(this){}不好是因为用到了缺省的拷贝构造函数,也许有风险,因此警告。
#16
类中的数据地址是在编译时就已经具有的了,也就是偏移量,下面举个例子,下面的例子都是假设在构造函数中执行的。
正确例子:
MyClass *p = new MyClass();
错误例子:
MyClass *p = new MyClassExtended(); // 假设MyClassExtended是MyClass的子类,这时属于MyClassExtended的数据还没有准备好,因为构造函数是从基类开始构造的,此时访问MyClassExtended扩展的数据就是错误的。
正确例子:
MyClass *p = new MyClass();
错误例子:
MyClass *p = new MyClassExtended(); // 假设MyClassExtended是MyClass的子类,这时属于MyClassExtended的数据还没有准备好,因为构造函数是从基类开始构造的,此时访问MyClassExtended扩展的数据就是错误的。