这是我在这里第一个问题,对我这么光顾。
我编写了一个重载的插入运算符,它返回一个对象的所有数据。出于某种原因,我试图称之为即。 cout<< * pkgArray [index]它什么也没显示,但如果我没有*它就会返回一个内存地址。下面是重载操作符和我尝试使用它。
ostream& operator<<(ostream& o, const OverNight& bObj) {
stringstream ss;
ss << bObj.getAddress() << ", " << bObj.getCity() << ", " << bObj.getState() << ", " << bObj.getZip();
string fullAddress = ss.str();
ss.str("");
int newWeight = bObj.getWeight();
ss << "$" << bObj.getUnitPrice() + bObj.getAdditional() << "/ounce";
string costPerOunce = ss.str();
o << left
<< setw(1) << "|"
<< setw(20) << bObj.getsname()
<< setw(1) << "|"
<< setw(20) << bObj.getName()
<< setw(1) << "|"
<< setw(60) << fullAddress
<< setw(1) << "|"
<< setw(10) << bObj.getType()
<< setw(1) << "|"
<< setw(10) << costPerOunce
<< setw(1) << "|"
<< endl;
o << left << "+" << setfill('-') << setw(136) << right << "+" << endl;
o << setfill(' '); // clears the hyphen filler.
return o;
}
int main() {
Package *pkgArray[15]; // package class is abstract.
OverNight *onObj; // assigned to pkgArray later on.
TwoDay *tdObj; // assigned to pkgArray later on.
// pkgArray is a pointerArray filled with objects of 2 derived classes.
for (int index = 0; index < max; index++) {
cout << pkgArray[index];
}
}
我试过* pkgArray [index]和&amp; pkgArray [index],后者返回一个内存地址,第一个没有返回任何内容。我对c ++很新,觉得我已经尝试了一切来解决这个问题。任何指导都将不胜感激。
谢谢
编辑:我添加了pkgArray的声明和分配给它的对象。我根据作业无法使用向量。
在进一步研究问题之后,我发现了正在发生的事情,重载运算符是不是正在接收正在传递的对象。我尝试解除引用pkgArray,并在基类中完成重载的插入运算符的功能,这是有效的。现在我的问题是我需要从动态数组中获取派生类的对象。我尝试在取消引用时应用优先级但无济于事。声明再次如下。
OverNight * onObj; //将指定派生类对象的指针。 TwoDay * tdObj; //将指定派生类对象的指针 包* pkgArray [15]; //这是一个类型为Package的动态数组,它是基类
创建OverNight对象和TwoDay对象后,它们将被分配给Package数组。
我正在尝试运行一个循环来调用重写的&lt;&lt;具有存储在动态数组中的派生对象的运算符。我在这项任务的斗争中学到了很多东西,但显然还不够解决这个问题。
我能够自己解决这个问题,当我被允许时,我会在3个小时内回答我自己的问题。
答案 0 :(得分:1)
在多态层次结构中对象进行I / O的常用模式并不是很明显。你通常大致这样实现它:
#include <iostream>
#include <vector>
class Base {
public:
virtual std::ostream &write(std::ostream &os) const {
return os << "Base\n";
}
};
class D1 : public Base {
public:
virtual std::ostream &write(std::ostream &os) const {
return os << "Derived 1\n";
}
};
class D2 : public Base {
public:
virtual std::ostream &write(std::ostream &os) const {
return os << "Derived 2\n";
}
};
std::ostream &operator<<(std::ostream &os, Base const &b){
return b.write(os);
}
int main(){
std::vector<Base *> objects;
Base b;
D1 d1;
D2 d2;
objects.push_back(&b);
objects.push_back(&d1);
objects.push_back(&d2);
for (int i=0; i<3; i++)
std::cout << *objects[i];
return 0;
}
在这种情况下,结果是:
Base
Derived 1
Derived 2
......正如你所希望的那样。
答案 1 :(得分:0)
*pkgArray[index]
尝试取消引用未定义为指针的对象,因此*对编译器没有意义(它使用指针变量中包含的第一个字节和类型描述来解释位于内存,它只是字节,直到通过解除引用获得更多信息。)
您可能正在接收没有为重载ostream定义正确解释的对象引用。
答案 2 :(得分:0)
将我的头撞在桌子上一段时间之后,我已经知道发生了什么事。当我将派生类的对象分配给类型基类的动态数组时,只将内存地址存储为基类类型。因此,当我运行循环时,我只能获得类型基类(Package)的对象,因此重载的运算符正在寻找OverNight类型的对象,而且TwoDay永远不会被调用。
谢谢你的