对象A中的对象B和对象B中没有指针的对象A的引用

时间:2016-02-05 17:03:10

标签: c++ constructor reference initialization initializer-list

所以我想做的是存储:

  • 对象A中的对象B和
  • 对象B中对象A的引用

虽然不使用指针。

我尝试避免使用指针和引用之间的唯一区别是访问语法。我不想写' - >'每次我访问对象B中的对象A.

我认为代码可以工作,但会引发分段错误:

A.H

#ifndef A_H
#define A_H

class B;
class A{
    B b;
public:
    A();
};
#endif

B.h

#ifndef B_H
#define B_H

class A;
class B{
    A& a;
public:
    B(A &_a);
};
#endif

A.cpp

#include "A.h"
#include "B.h"

A::A():b(B(*this)){}

B.cpp

#include "B.h"
#include "A.h"

B::B(B &_b):a(_b){}    

我认为导致分段错误的第一件事是在初始化列表中使用'this'关键字(未初始化的实例),但我已经读过,只要我不访问它,一切都应该没问题。我的构造函数是空的,所以我不会出错。

是否有可能像我这样做?如果不是那么为什么并且有什么东西可以让我不写“ - >”?

修改 确实有一些编译错误,因为它只是写为伪代码,只是为了不在这里粘贴不必要的代码,所以没有人浪费时间。编写伪编码后当然编译了。 But goo.gl/DHlM6X

但现在它运行没有seg错误。我想我的项目中有一些不同的东西。我将不得不测试为什么它在项目中不起作用,我将发布问题所以问题可以得到真正的答案。

1 个答案:

答案 0 :(得分:1)

首先,在这里使用引用似乎是一个好主意,而不是搞乱指针,但你不会自己解决这个问题。为什么?引用意味着链接到一个对象,您可以确定链接对象的寿命比引用长。

所以你的代码

class B{
  A& a;
};

基本上表明:“对于B类型的每个对象,都有一个已知的,不可更改的A类型的对象,它在创建B类型的对象之前就已存在并且仍然存在在B - 对象被破坏时“。

同时你的代码

class A{
  B b;
};

陈述:“A类型的每个对象都包含一个B类型的对象”,它基本上告诉编译器为类型为A的对象分配内存(包括空格)对于B b),然后在该内存中的正确位置构造一个类型为B的对象,然后构造一个类型为A的对象。但是在这个例子中,A B之后构建并在 B之前销毁

两个陈述相互排斥。

所以你要么切换到指针(状态“对象知道另一个X类型的对象”并且可以是nullptr),或者你可以考虑这样做:

class Combined{
  A a;
  B b;
}

然后添加需要了解Combined类中两个对象的函数。

在标准中,我发现以下有关您的问题及其根本不起作用的原因:

  

9.3.2 此指针[class.this]
  在非静态(9.3)成员函数的主体中,关键字this   是一个prvalue表达式,其值是调用该函数的对象的地址。这个类型在一个成员函数中   X类是X *。如果成员函数声明为const(...)

所以我可以说,this只定义了“非静态成员函数体内”的行为。有些编译器在课程的其他部分也允许thistypeid(this)sizeof(this),但我无法在标准中找到它。