我完成了以下运算符重载,它在预期的下面的类对象上工作。 但是当我将此指针传递给向量中的类对象时,输出流不起作用 (以我定义的方式)
我很抱歉这类问题,但我是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;
}
答案 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;