大家看看这样构造对象会不会有问题。。。

Elkel 2002-06-26 03:39:59
我有这样一个设计,类A和类B是无向导航关系,他们是1对1的。

class B;

class A
{
public:
A();
~A();
...
private:
B b_obj;
};

A::A() b_obj(this);
{
}

class B
{
public:
B(A *);
....
private:
A *p_a_obj;
}

B::B(A *pa) : p_a_obj(pa)
{
}

在vc6下编译有一个警告,怀疑这样使用会有问题。
...全文
80 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Elkel 2002-06-26
  • 打赏
  • 举报
回复
我明白了,结贴
jack4liang 2002-06-26
  • 打赏
  • 举报
回复
组合是最容易出问题的了,为什么不用继承呢?其实class b 需要 class a
的方法罢了,为什么要用一个实例?继承一下不就得了。
tinytot 2002-06-26
  • 打赏
  • 举报
回复
在文件中你可以对一个类中的对象指针做前项声明, 比如B类中A类的对象指针,你可以这样写:

class A;

class B
{
public:
B(A *pa) : p_a_obj(pa) {}
//....
private:
A *p_a_obj;
};

class A
{
public:
A() : b_obj(this) {}
~A();
//...
private:
B b_obj;
};
tinytot 2002-06-26
  • 打赏
  • 举报
回复
在文件中你可以对一个类中的对象指针做前项声明, 比如B类中A类的对象指针,你可以这样写:

class A;

class B
{
public:
B(A *pa) : p_a_obj(pa) {}
//....
private:
A *p_a_obj;
};

class A
{
public:
A() : b_obj(this) {}
~A();
//...
private:
B b_obj;
};
prototype 2002-06-26
  • 打赏
  • 举报
回复
elkel, i am pretty sure that is ok. reason: memory operations for you objects is finished before your ctors, your ctors just initialize your objects (set values for member data, subobjects, vptrs, ...), they don't deal with memory allocation stuff (it is handled by your compiler, or your new operators). that means 'this' is already a well-constructed object before your ctor is called.
jack4liang 2002-06-26
  • 打赏
  • 举报
回复
我觉得这个东西有点像鸡生蛋,蛋生鸡的问题。
prototype 2002-06-26
  • 打赏
  • 举报
回复
elkel, you mean that is not the problem in your real code? what concerns you then? i think your sample code is fine except the declaration order.
Elkel 2002-06-26
  • 打赏
  • 举报
回复
我的疑虑是,A的对象还没有构造,我就使用了this指针,会不会该指针未定义。
alula 2002-06-26
  • 打赏
  • 举报
回复
class A
{
public:
A();
~A();
...
private:
B b_obj; // 这里,编译器虽然知道B是一个class,但是它无法确定class的大小,应该行不通。
//但也不排除某些编译器所支持的对象模型的特殊性,<the C++ object module>里面有提到这种模型。
};
Elkel 2002-06-26
  • 打赏
  • 举报
回复
to prototype
我提问有些仓促,你说的确实是一个问题
zeroweb 2002-06-26
  • 打赏
  • 举报
回复
A::A(): b_obj(this);?我不懂
alula 2002-06-26
  • 打赏
  • 举报
回复
class B;

class A
{
public:
A();
~A();
...
private:
B b_obj;
// 这里,编译器虽然知道B是一个class,但是它无法确定class的大小,应该行不通。
//但也不排除某些编译器所支持的对象模型的特殊性,<the C++ object module>里面有提到这种模型。
};
prototype 2002-06-26
  • 打赏
  • 举报
回复
en, there is a problem in your class a, because when it is defined, class b is an incomplete class and you are not allowed to have an object (b_obj) of incomplete type in your class.

a correct way is like the following (i just change the order of declaration):

class a;

class b
{
public:
b( a* );
...
private:
a* p_a_obj;
};

b::b( a* pa ) : p_a_obj( pa ) {}

class a
{
a();
~a();
...
private:
b b_obj;
};

a::a() : b_obj( this ) {}
Elkel 2002-06-26
  • 打赏
  • 举报
回复
警告就是this指针那行
天外飞狐 2002-06-26
  • 打赏
  • 举报
回复
A::A() b_obj(this);
{
}
应该为A::A():b_obj(this){}
这样做应该没问题
Elkel 2002-06-26
  • 打赏
  • 举报
回复
我做了一个测试程序,vc6中用起来没有问题。只是我不知道ISO C++98中有没有明确定义
A::A(): b_obj(this);
这种用法。

#include <iostream>

using namespace std;

class A;

class B
{
public:
B(A *);
~B() {}

private:
A * p_a_obj;
};

B::B(A *pa) : p_a_obj(pa)
{
cout << p_a_obj << endl;
}

class A
{
public:
A();
~A() {}

private:
B b_obj;
};

A::A() : b_obj(this)
{
}


int main(int argc,char *argv[])
{
A a_obj;
cout << &a_obj <<endl;
return 0;
}
rosycloud 2002-06-26
  • 打赏
  • 举报
回复
警告的是哪一行啊?
我看不应该有什么问题,
除了this指针可能用的有点问题
rosycloud 2002-06-26
  • 打赏
  • 举报
回复
警告的是哪一行啊?
我看不应该有什么问题,
除了this指针可能用的有点问题
sywj115447 2002-06-26
  • 打赏
  • 举报
回复
A::A(): b_obj(this);?
我个人倾向于不使用这种方法!
zhengyunpeng 2002-06-26
  • 打赏
  • 举报
回复
A中的成员变量b_obj的类型应该是B*
加载更多回复(4)

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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