首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子类类型的C++输出变量

子类类型的C++输出变量
EN

Stack Overflow用户
提问于 2013-10-28 20:16:08
回答 1查看 239关注 0票数 0

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

代码语言:javascript
复制
Road(string code, int length, int travel)

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

代码语言:javascript
复制
Freeway(double toll)
Highway(string terrain)

在读取以这种格式出现的文件时.

代码语言:javascript
复制
ROAD1,300,190,asphalt
ROAD2,72,45,4.75
(etc...)

...the方法根据最后一个参数(double或string)检测是否为高速公路或高速公路,并相应地创建其中任何一个参数的新实例,并将其发送到数组,并读取以下行,直到没有更多的行可读取为止。

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

代码语言:javascript
复制
(ROAD1,300,190)

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

代码语言:javascript
复制
Highway
(,-842150451, -842150451)Terrain:

我不知道这些价值观是什么。此外,它没有打印地形或第一个参数,代码字符串。我做错了什么?下面是我在“公路”和“公路”课程中使用的代码:

代码语言:javascript
复制
void Road::writer(ostream &out) const {
    cout << "(" << code  << "," << length << "," << travel << ")"; 
}

代码语言:javascript
复制
void Highway::writer(ostream & out) const {
    out << "Highway" << endl;
    Road::writer(out);
    out << "Terrain:" << terrain << endl;
}

这就是我如何调用输出具有参数的道路的方法:

代码语言:javascript
复制
void TestHeader::outputRoads(){
    for(int i=0;i<ind;i++)  //ind is the number of elements of the road array
        cout<<*vecRoads[i]<<endl;
}
EN

回答 1

Stack Overflow用户

发布于 2013-10-28 21:49:52

请确保初始化

正如标题中所述,初始化FreewayHighway时,应该调用Road构造函数。

例如:

代码语言:javascript
复制
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
}

改变这个

代码语言:javascript
复制
void Road::writer(std::ostream &out) const{
    std::cout << "(" << code  << "," << length << "," << travel << ")";
}

到这个

代码语言:javascript
复制
void Road::writer(std::ostream &out) const{
    out << "(" << code  << "," << length << "," << travel << ")";
}

或者这个

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
void Highway::writer(ostream & out) const {
    out << "Highway\n" << *dynamic_cast<Road*>(this) << "Terrain: " << terrain << "\n";
}

编辑:

再看一看,如果没有操作符重载,您的最后一个函数甚至不应该工作。当您尝试将对象输出到流时,C++不知道如何处理它,除非操作符是重载的doe流输出。

代码语言:javascript
复制
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;
}

如果没有超载就不能工作,但是

代码语言:javascript
复制
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函数一起工作

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19644277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档