(高手请进)复杂的Class,B中包含A*,A中又包含B, 产生 warning C4355: 'this' : used in base member initializer list

DoubleJiang 2004-04-13 03:41:37
Class A;
Class B;

Class A
{
public:
B b1;
}

Class B
{
public:
B(Class* pA){ m_pA = pA;}
Class* m_pA;
}

// VC 6.0 + sp5, build warning:
warning C4355: 'this' : used in base member initializer list
...全文
44 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
双杯献酒 2004-04-15
  • 打赏
  • 举报
回复
同意
yxlijinzhu(蚂蚁)

这个警告是说:
此时的this是存在的。
但此时this所代表的对象是不安全的。
由于编译器不能断定您不会通过this指针来操作
它还没有构造完毕的对象,因此会发出警告。
在您的例子中,可以忽略该警告。

class A;
class B;
class B
{
public:
B(A* pA=NULL)
{
m_pA = pA;
// 在此操作 pA->b1.XXX将产生问题
// 因为得到的参数pA的对象实际还没有构造完成!!!!!
}
A * m_pA;
} ;
class A
{
public:
A() {;}
B b1;
} ;
int main()
{
A a ;
B b( &a ) ;
return 0;
}
ndy_w 2004-04-15
  • 打赏
  • 举报
回复
yxlijinzhu(蚂蚁)
双杯献酒 2004-04-15
  • 打赏
  • 举报
回复
假设您有两个类A和B,
彼此包含对方的"指针"做成员变量。
可以使用声明.

参考:

// 头文件 A.h
class B;
class A
{
int dataA;
B* m_pB;
};

// 头文件 B.h
class A;
class B
{
int dataB;
A* m_pA;
};

// 文件 A.cpp
#include "A.h"
#include "B.h"

A::A()
{
dataA = 0;
m_pB = 0;
}

// 文件 B.cpp
#include "B.h"
#include "A.h"
B::B()
{
dataB = 0;
m_pA = 0;
}
joymaoyong 2004-04-15
  • 打赏
  • 举报
回复
他可以让你方便类间操作
joymaoyong 2004-04-15
  • 打赏
  • 举报
回复
试试 friend
yxlijinzhu 2004-04-15
  • 打赏
  • 举报
回复
下面的这两种写法导致两种完全不同的结果.

A::A():b1(this)
{;}
这样写时, b1是在类A的对象产生前开始初始化的, 那时A的对象还没有完全构造完毕, 也就是说, 在A构造对象时, 他必须先构造对象b1, 因为b1是他的一个成员, 只有将类中的所有成员都构造完毕之后, 这个类的对象才能算是构造完毕, 此时this才是安全的.

而, 上面的写法, 是表示, 构造对象b1时, 用this作为参数进行构造, 而事实上, 此时this(即A的对象)正处在构造的过程中.

A::A()
{
b1.m_pA = this ;
}

这种写法表示在A的构造函数内进行初始化工作, 此时A的对象已经完全构造完毕, this是安全的, 可用的.


你的这个问题属于构造函数调用顺序及类中对象成员的初始化问题.

类实例化时, 先调用基类的构造函数, 这个原则也是可以递归的. 如果类中含有对象成员时, 先构造该对象.等对象成员都构造完毕后再调用该对象所属的类的构造函数.

说的好像很罗嗦, 其实就是这样.
DoubleJiang 2004-04-15
  • 打赏
  • 举报
回复
解决方案固然很多,但是我想知道这类东西的定义,为什么不能这样操作?
ColderRain 2004-04-14
  • 打赏
  • 举报
回复
把B b1;改成B* pB1;
DoubleJiang 2004-04-14
  • 打赏
  • 举报
回复
up
DoubleJiang 2004-04-14
  • 打赏
  • 举报
回复
up
DoubleJiang 2004-04-14
  • 打赏
  • 举报
回复
成员 B b1; 是类A的非静态成员,构造函数属于静态函数吗?
QunKangLi 2004-04-13
  • 打赏
  • 举报
回复
this指针只能用在类的非静态函数里.建议用另外的方法对B的的m_pA进行操作,如:
A::A()
{
b1.m_pA = this ;
}
DoubleJiang 2004-04-13
  • 打赏
  • 举报
回复
sorry! 写的有问题,应是:
class A;
class B;
class B
{
public:
B(A* pA = NULL){ m_pA = pA;}
A * m_pA;
};
class A
{
public:
A();
B b1;
} ;
A::A():b1(this)
{;}

int main()
{
A a ;
B b( &a ) ;
return 0;
}
QunKangLi 2004-04-13
  • 打赏
  • 举报
回复
看不懂,怎么全是首字母大写的Class,Class* m_pA又是个什么类型的变量?


class A;
class B;
class B
{
public:
B(A* pA=NULL){ m_pA = pA;}
A * m_pA;
} ;
class A
{
public:
A() {;}
B b1;
} ;
int main()
{
A a ;
B b( &a ) ;
return 0;
}
DoubleJiang 2004-04-13
  • 打赏
  • 举报
回复
up

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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