• 全部
  • 问答

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

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下编译有一个警告,怀疑这样使用会有问题。
...全文
50 点赞 收藏 24
写回复
24 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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*
回复
相关推荐
java面试总结
面试题总结——JAVA高级工程师近期考虑换工作的问题,于是投简历面试,面试5家公司的高级Java工程师,有4家给了我offer,想着总结一下面试经验,方便最近正在寻求机会的你们一、无笔试题不知道是不是职位原因还是没...
谈谈java中的构造函数
本篇博文主要是为新手、对java语言感兴趣的人和那些没有系统学习过java基础知识的人进行一个总结,在文章中对构造函数进行了较为详细的说明和讨论,也包含了我个人对于java面向对象中构造函数的一些看法。...
闲来无事,看看构造函数
记得一年之前在写代码的时候问了小伙伴一个问题,我说:“你说如果我在声明的时候初始化,它会在对象初始化的哪个阶段被赋值?” 小伙伴想了想回答我:“还是在构造函数里面给变量初始化吧。” 程序当口,时间比较紧...
Java基础知识面试题(2020最新版)
原理是什么Java语言哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类何不同?Java应用程序与小程序之间那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的...
Java面试题大全(2020版)
发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 本套Java面试题大全,全的不能再全,哈哈~ 一、Java 基础 1. JDK 和 JRE 有什么区别? JDK:Java ...
[求助]面向对象大家帮忙看看这样的业务实体构造有没有问题
} } 大意是这样的,最近学习统一过程,想重新把原来的东西用面向对象的方式重新写一遍,现在面临一些一对多与多对多关系的问题。 比如这个,在一个StudentInfo实体中,存在着一对多的关系,List<CetInfo> CetInfos...
C++ 类(构造函数和析构函数)
C++编译器构造析构方案 PK 对象显示初始化方案 构造函数的分类以及调用 默认的构造函数 构造函数调用规则 构造函数和析构函数的总结 构造函数和析构函数的由来 类的数据成员不能在类的声明时候初始化,为了解决...
vs2019安装和使用教程(详细)
vs2019已经在4月2日正式发布,vs2019发布这个链接: vs2019发布活动 vs2019和vs2017一样强大,项目兼容,不用互相删除,而且C/C++,Python,F#,ios,Android,Web,Node.js,Azure,Unity,HTML,...
【C++】C++类和对象构造函数和析构函数
类是对某一事物的抽象描述,具体地讲,类是C++中的一种构造的数据类型。它即可包含描述事物的数据,又可包含处理这些数据的函数,类在程序运行时是被用作样板来建立对象的。所以要建立对象,首先必须定义类。 定义...
JAVA基础
最近了Github上一个巨良心的java项目。准备跟着这个项目对java基础进行一下夯实。 首先对JAVA基础做一下回顾 1. 面向对象和面向过程的区别 面向过程 面向对象 2. Java 语言哪些特点? 3. 关于 JVM JDK 和 JRE ...
JavaScript构造函数及原型对象
对象实质上就是一组没有特定顺序的值,对象中每个属性、方法都一个名字,每个名字都映射到了一个值,因此我们可以将对象想象称为一个散列表。 JS是一种基于对象的语言,对象的概念在JS体系中十分的重要,因此...
Java初始化对象的工具 - 构造
那么具体行为的发生,也就是方法的调用要靠对象来完成,同时属性值也要附着在对象上才意义。创建对象的过程被叫做类的实例化,或者称为对象的初始化,在这个过程中需要使用的就是new关键字和类的构造器。
java-面向对象编程-说说构造方法
//类名 对象名 =new 类的构造方法在这里,我们说到关于类的构造方法,可能存在一些让人觉得很混乱的地方,所以这一章就把构造方法提取出来,单独介绍。下面进入正题:首先,我们来谈谈什么叫构造方法,既然都说了...
多线程面试题(值得收藏)
金九银十快到了,即将进入找工作的高峰期,最新整理的最全多线程并发面试47题和答案总结,希望对想进BAT的同学帮助,由于篇幅较长,建议收藏后细看~ 1、并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,...
浅谈一下JAVA对象对象引用以及对象赋值
今天班级同学问起JAVA对象的引用是什么。正好趁着这次机会,自己总结一下JAVA对象对象引用以及对象赋值。自己总结了所看到的网上相关方面的不少帖子,整理汇总形成下面的文章。   Java对象及其引用  初学Java...
C++之对象数组+对象成员+拷贝构造函数(深/浅)
对象数组实例(栈中实例化和堆中实例化):class Coordinate { public: int m_iX; int m_iY; };int main() { Coordinate coord[3];//栈中实例化 coord[1].m_iX = 10; Coordinate *p = new Coordinate[3];//堆中...
构造器的作用或者说构造和无参构造的区别
最简单直白的话,当你要new一个对象的时候,必须要有构造器才能new出来,类里面默认有无参的构造器,不到的,当我们要创建一个构造的时候,最好也把无参构造写出来。    作用: java中构造方法指的是: ...
JS中构造函数、实例对象和原型对象三者之间的关系
1、首先需要明白一个知识点:一个需要共享并且通过实例对象调用的方法,是在构造函数的原型...(1)实例对象通过构造函数进行创建,原型对象构造函数就产生的。 (2)构造函数中的属性通过结构(dir)查...
JAVA上百实例源码以及开源项目
状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
为什么在创建子类对象的时候调用父类的构造函数
原文:Constructors of Sub ...1.为什么在创建子类对象的时候调用父类的构造函数? public class Sub extends Super{ public Sub() { System.out.println("Sub"); } public static void main(...
C++返回值为对象时复制构造函数不执行怎么破
先说点背景知识,调用复制构造函数的三种情况: 1.当用类一个对象去初始化另一个对象时。 2.如果函数形参是类对象。 3.如果函数返回值是类对象,函数执行完成返回调用时。 在辅导学生上机时,同学第3点提出...
Kotlin学习(四)—— 类与对象(类的声明,属性初始化问题构造器)
这样就定义了最简单的一个类了,什么都没有的类,没有类头和类体。(没有类体,可以省略花括号) 接下来定义一个正常的类: class Person public constructor(name: String,age: Int)/*主构造...
调用无参构造函数创建对象与函数声明
问题:如下两条语句的区别是什么? Student a; Student b(); 假设一个Student类: class Student { private: int age; public: // 不带参数的构造函数 Student() { this->age = 7; } //...
C++ new 的用法 (总结)
C++ new 的基本和高级用法new 的基本用法
【C++深度剖析教程1】C++中的经典问题解析-c++中的对象构造顺序与析构顺序
c++中的对象构造顺序与析构顺序,const成员函数的性质!毕竟还是菜鸟,所以就只把自己的学习笔记记录一下吧,以后学有所成,一定分享牛逼的技术博客!!!当程序中存在多个对象时,如何确定这些对象的析构顺序?...
java对象序列化与反序列化中的构造方法问题
老规矩,先上代码再总结:import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream;...
子类继承父类时,创建对象,构造方法的调用问题
在学习继承的时候,遇到一些小问题,这里总结一下,错误望指正: 先来一段代码: //标准父类 class Father{ //成员变量 private String name; private int age; //构造方法 //空参 public ...
不用构造器也能创建对象
不用构造器也能创建对象
全局对象构造函数在main函数之前执行?
#include using namespace std; class CTest { public: CTest() { cout 构造函数..." ; } ~CTest() { cout 析构函数..." ; } }; int main() { CTest t;...可见:全局对象构造函数
构造函数线程安全
线程是编程中常用而且强大的手段,需要面对的就是线程安全问题。Java 中的构造函数是否是线程安全的呢?
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-06-26 03:39
社区公告
暂无公告