使用指针数组中的对象调用重载的友元 ostream 插入运算符将返回内存地址



我写了一个重载的插入运算符,它返回对象的所有数据。出于某种原因,当我试图称它为即。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] 和 &pkgArray[index],后者返回内存地址,第一个什么都不返回。我对 c++ 相当陌生,感觉我已经尝试了一切来解决这个问题。

编辑:我添加了pkgArray的声明以及分配给它的对象。我无法根据作业使用向量。

在进一步研究问题后,我发现了正在发生的事情,是重载的运算符没有拾取正在传递的对象。我已经尝试取消引用 pkgArray,并完成了基类中重载插入运算符的功能,该功能有效。现在我的问题是我需要从动态数组中获取派生类的对象。我尝试在取消引用时应用优先级无济于事。声明如下。

OverNight * onObj;//指针,该指针将被分配派生类的对象。两天 * tdObj;将分配派生类对象的指针软件包 * pkgArray[15];这是一个 Package 类型的动态数组,它是基类

创建隔夜对象和两天对象后,将它们分配给 Package 数组。

我正在尝试运行一个循环,该循环使用存储在动态数组中的派生对象调用被覆盖的<<运算符。在这项任务的斗争中,我学到了很多东西,但显然还不足以解决这个问题。

多态层次结构中的对象执行 I/O 的常用模式并不明显。不过,您通常大致像这样实现它:

#include <iostream>
#include <vector>
class Base {
public:
    virtual std::ostream &write(std::ostream &os) const {
        return os << "Basen";
    }
};
class D1 : public Base {
public:
    virtual std::ostream &write(std::ostream &os) const {
        return os << "Derived 1n";
    }
};
class D2 : public Base {
public:
    virtual std::ostream &write(std::ostream &os) const {
        return os << "Derived 2n";
    }
};
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

。正如你所希望的那样。

*pkgArray[index]尝试取消引用未定义为指针的对象,因此*对编译器没有意义(它使用指针变量中包含的第一个字节和类型描述来解释内存中的数据,这些数据对它来说只是字节,直到通过取消引用给出更多信息)。

您可能正在接收对象引用,而您尚未为重载的 ostream 定义正确的解释。

我已经

弄清楚发生了什么。当我将派生类的对象分配给基类类型的动态数组时,只有内存地址被存储为基类类型。因此,当我运行循环时,我只能获取基类(Package)类型的对象,因此正在寻找OverNight和TwoDay类型的对象的重载运算符永远不会被调用。

相关内容

最新更新