重载 ostream << 运算符,指针作为参数,导致输出上的内存地址

Overloading ostream << operator with pointer as parameter resulting with memory adress on output

本文关键字:lt 输出 内存 地址 运算符 ostream 指针 重载 参数      更新时间:2023-10-16

我在重载ostream运算符时遇到了一些麻烦。有 3 个类,抽象基类 Packet 另一个从数据包继承的抽象类 Sequence 和从 Sequence 继承的类 TimeHistory。

class Packet
{
//some stuff
};
template <typename T = double>
class Sequence : public Packet
{
std::vector<T> buffer;
//some other stuff
}
template <typename T = double>
class TimeHistory : public Sequence<T>
{
template <typename X>
friend std::ostream &operator<<(std::ostream &out, Packet *A);
//another stuff
}

还有一个朋友函数来打印对象中的数据

std::ostream &operator<<(std::ostream &out, Packet *A)
{
TimeHistory<T> *th = dynamic_cast<TimeHistory<T> *>(A);
out << th->device
<< th->description
<< th->channelNr;
for (auto in : th->buffer)
out << in << std::endl;
return out;
} 

当我创建类的实例时,如下所示:

std::unique_ptr<Packet> channel1 = std::make_unique<TimeHistory<double>>(/*some constructor stuff*/);

并调用函数

std::cout<<(channel1.get());

我在输出端只有一个存储单元地址:0x560c8e4f1eb0 有人可以指出我做错了什么吗?

std::unique_ptr::get将返回指向托管对象的指针。如果要获取对托管值使用的引用

std::cout<< *channel1;

要重载抽象类的operator<<,您可以使用引用而不是指针:

friend std::ostream &operator<<(std::ostream &out, Packet &A);