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

时间:2012-04-26 16:26:21

标签: c++

这是我在这里第一个问题,对我这么光顾。

我编写了一个重载的插入运算符,它返回一个对象的所有数据。出于某种原因,我试图称之为即。 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个小时内回答我自己的问题。

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永远不会被调用。

谢谢你的