0

出于某种原因,以下内容不会像我的程序那样崩溃,但我很确定它在设计上是相似的。一方面,输出不正确。它输出类似于:

0x537ff4 5471612

而主程序输出(nil)为指针地址。

问题的关键可能是 Drv 中的 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;
}
4

3 回答 3

2

这段代码:

Drv() : Generic((LCDText *)display_) {
    display_ = new Display((Generic *)this);
};

首先运行父类的 ctor,其值尚未初始化display_,然后独立设置display_,但是更改父类为时已晚。所以父类持有的指针永远不会被正确设置。我猜你需要添加一个受保护的setter方法(或者使父类持有的指针成员本身受到保护)。

于 2009-10-19T01:47:23.240 回答
2

您的 Drv 构造函数将 Drv::display_ 的垃圾、未初始化的值传递给 Generic,然后在构造函数主体中对其进行初始化。你可以在这里做几件事,我的首选是:

class Drv : public Generic {
    Display* display() { return (Display*)lcdText_; }
public:
    Drv() : Generic(new Display(this)) {}
}

因为它不会导致重复字段,但您也可以在 Generic 中有一个抽象的 getLcdText(),如果您已经在使用虚拟方法,这可能会更好。

于 2009-10-19T01:47:41.790 回答
1

在 Drv 的构造函数中,当您第一次调用 Generic 的构造函数时 display_ 仍未初始化。直到稍后您才可以新建指针。

于 2009-10-19T01:48:04.533 回答