实例化对象和对象成员

时间:2009-10-19 01:31:48

标签: c++ inheritance instantiation

出于某种原因,以下内容不像我的程序那样崩溃,但我很确定它的设计类似。首先,输出不正确。它输出类似于:

的内容
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;
}

3 个答案:

答案 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_的构造函数时,仍然未初始化。直到稍后你才新建指针。