0

我正在编写一个程序,该程序具有一个接收带有道路的 .txt 文件的方法,因此(现在请原谅我的粗略翻译)有一个名为Road的类,它具有 3 个属性:

Road(string code, int length, int travel)

还有两个子类继承了这 3 个参数,但每个子类都有一个额外的参数:

Freeway(double toll)
Highway(string terrain)

在阅读以这种格式出现的文件后...

ROAD1,300,190,asphalt
ROAD2,72,45,4.75
(etc...)

...该方法根据最后一个参数(双精度或字符串)检测它是高速公路还是高速公路,并相应地创建其中任何一个的新实例,并将其发送到数组,并读取下一行直到出现没有更多的行要阅读。

到目前为止,这工作正常。但是在打印数组元素的参数时,如果我使用 Road 类中的打印方法,我自然会得到:

(ROAD1,300,190)

这是很自然的,因为该类没有最后一个参数。但是,如果我使用 Freeway 或 Highway 类中的相同方法进行打印,我会得到以下输出(在高速公路的情况下):

Highway
(,-842150451, -842150451)Terrain:

我不知道这些值是什么。另外,它不打印地形,也不打印第一个参数,即代码字符串。我究竟做错了什么?这是我在RoadHighway类中使​​用的代码:

void Road::writer(ostream &out) const {
    cout << "(" << code  << "," << length << "," << travel << ")"; 
}

void Highway::writer(ostream & out) const {
    out << "Highway" << endl;
    Road::writer(out);
    out << "Terrain:" << terrain << endl;
}

这就是我调用输出道路及其参数的方法的方式:

void TestHeader::outputRoads(){
    for(int i=0;i<ind;i++)  //ind is the number of elements of the road array
        cout<<*vecRoads[i]<<endl;
}
4

1 回答 1

0

确保初始化

如标题所述,当你初始化你的Freeway或者Highway你应该调用Road构造函数。

例如

Highway::Highway(std::string code, int length, int travel, std::string terrain)
    : Road(code, length, travel){

    this->terrain = terrain; // Arguments shouldn't have the same name as class memebers
}

改变这个

void Road::writer(std::ostream &out) const{
    std::cout << "(" << code  << "," << length << "," << travel << ")";
}

对此

void Road::writer(std::ostream &out) const{
    out << "(" << code  << "," << length << "," << travel << ")";
}

或这个

std::ostream &operator <<(std::ostream &out, const Road &road){
    out << "(" << road.code  << "," << road.length << "," << road.travel << ")";
    // However you want to get the members

    return out;
}

通过运算符重载,您可以将操作简化为

void Highway::writer(ostream & out) const {
    out << "Highway\n" << *dynamic_cast<Road*>(this) << "Terrain: " << terrain << "\n";
}

编辑:

再看一遍,你的最后一个函数甚至不应该在没有运算符重载的情况下工作。当您尝试将对象输出到流时,C++ 不知道如何处理该对象,除非运算符重载 doe 流输出。

void TestHeader::outputRoads(){
    for(int i = 0; i < ind; i++)  //ind is the number of elements of the road array
        std::cout << *vecRoads[i] << std::endl;
}

不超载将无法工作但是

void TestHeader::outputRoads(){
    for(int i = 0; i < ind; i++)  //ind is the number of elements of the road array
        *vecRoads[i].writer(std::cout);
}

将与该writer功能一起使用

于 2013-10-28T21:49:52.097 回答