所以我想做的是存储:
虽然不使用指针。
我尝试避免使用指针和引用之间的唯一区别是访问语法。我不想写' - >'每次我访问对象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'关键字(未初始化的实例),但我已经读过,只要我不访问它,一切都应该没问题。我的构造函数是空的,所以我不会出错。
是否有可能像我这样做?如果不是那么为什么并且有什么东西可以让我不写“ - >”?
修改 确实有一些编译错误,因为它只是写为伪代码,只是为了不在这里粘贴不必要的代码,所以没有人浪费时间。编写伪编码后当然编译了。 goo.gl/DHlM6X
但现在它运行没有seg错误。我想我的项目中有一些不同的东西。我将不得不测试为什么它在项目中不起作用,我将发布问题所以问题可以得到真正的答案。
答案 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
只定义了“非静态成员函数体内”的行为。有些编译器在课程的其他部分也允许this
,typeid(this)
或sizeof(this)
,但我无法在标准中找到它。