出于某种原因,以下内容不像我的程序那样崩溃,但我很确定它的设计类似。首先,输出不正确。它输出类似于:
的内容0x537ff4 5471612
主程序输出(nil)指针地址。
问题的关键可能是Dr_。
中的display_以下是代码:
#include <iostream>
#include "debug.h"
class LCDText {
public:
int rows_;
LCDText() { rows_ = 10; };
};
class Generic {
LCDText *lcdText_;
public:
Generic(LCDText *lcdText) { lcdText_ = lcdText; };
void Setup() {
Error("%p %d", lcdText_, lcdText_->rows_);
}
};
class Display : public LCDText {
Generic *visitor_;
public:
Display(Generic *visitor) { visitor_ = visitor; };
};
class Drv : public Generic {
Display *display_;
public:
Drv() : Generic((LCDText *)display_) {
display_ = new Display((Generic *)this);
};
~Drv() { delete display_; };
};
int main()
{
Drv drv;
drv.Setup();
return 0;
}
答案 0 :(得分:2)
此代码:
Drv() : Generic((LCDText *)display_) {
display_ = new Display((Generic *)this);
};
首先运行父类的ctor,其未初始化值为display_
,然后独立设置display_
,但是,更改父类太晚了。因此,父类保持的指针永远不会被正确设置。我想你需要添加一个受保护的setter方法(或使父类保持的指针成员本身受到保护)。
答案 1 :(得分:2)
在构造函数体中初始化之前,您的Drv构造函数将Drv :: display_的垃圾,未初始化值传递给Generic。你可以在这里做几件事,我的首选是:
class Drv : public Generic {
Display* display() { return (Display*)lcdText_; }
public:
Drv() : Generic(new Display(this)) {}
}
因为它不会导致重复字段,但您也可以在Generic中使用抽象的getLcdText(),如果您已经在使用虚拟方法,则可能会更好。
答案 2 :(得分:1)
在Drv的构造函数中,当您第一次调用Generic display_的构造函数时,仍然未初始化。直到稍后你才新建指针。