我正在编写一个程序,该程序具有接收带有 roads 的.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)
这是很自然的,因为该类没有最后一个参数。但是,如果我使用高速公路或高速公路类中的相同方法打印,我会得到以下输出(在高速公路的情况下):
Highway
(,-842150451, -842150451)Terrain:
我不知道这些值是什么。另外,它不会打印地形,也不会打印第一个参数,即代码字符串。我做错了什么?这是我在道路和高速公路类上为此使用的代码:
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;
}
确保初始化
如标题中所述,初始化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 << "Highwayn" << *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
函数一起使用