运算符在访问包含它的vector元素时,类对象的重载不起作用?

时间:2014-12-22 18:31:26

标签: c++ c++11 vector operator-overloading

我完成了以下运算符重载,它在预期的下面的类对象上工作。 但是当我将此指针传递给向量中的类对象时,输出流不起作用 (以我定义的方式)

我很抱歉这类问题,但我是C ++的新手,我不知道如何准确地提出这个问题。

运算符重载:(shape.cpp)

ostream &operator<<(ostream &output, Shape &S)
{
    output << S.name << " (" << S.id << ") " << endl;
    return output;
}

内部形状类(shape.h): friend ostream& operator<<(ostream& output, Shape &S);

的main.cpp

#include <iostream>
#include <vector>
using std::cout;
int main()
{
    vector<Shape*> array;
    Shape * s1 = new Shape("Square");

    array.push_back(s1);
    cout << *s1; //Prints "Square (1)" 
    cout << array[0]; //Prints "007CADC8" maybe hex address of vector element?

    return 0;
}

2 个答案:

答案 0 :(得分:5)

此操作失败,因为您输出Shape *,类似于cout << s1时发生的情况。您需要执行与前一行中相同的操作,并取消引用向量中包含的指针:

cout << *array[0];

答案 1 :(得分:1)

该行:

cout << array[0];

相当于:

Ship* shipPtr = array[0];
cout << shipPtr;

您只是插入指向cout的指针。

使用

cout << *array[0];

打印对象。

此外,作为编程风格,请删除endl功能中的operator<<。只在调用函数中添加它。

operator<<功能:

ostream &operator<<(ostream &output, Shape &S)
{
    output << S.name << " (" << S.id << ") "; // Remove endl
    return output;
}

用法:

cout << *s1 << endl;
cout << *array[0] << endl;

这也允许调用函数使用:

Shape* s1 = new Shape("Square");
Shape* s2 = new Shape("Circle");

cout << *s1 << "," << *s2 << endl;