gpt4 book ai didi

C++ 继承运算符<<

转载 作者:行者123 更新时间:2023-11-30 01:15:04 24 4
gpt4 key购买 nike

我有几个对象(类)都继承自基类结构。这些对象的打印方式各不相同,因为它们具有不同的成员变量但具有共同的功能。

我希望能够有一个结构列表并打印它们,而不必将它们转换回它们的特定对象,即:结构 -> 建筑。

这在 C++ 中可能吗?

class Structure
{

};

class Building : public Structure
{
public:
friend std::ostream& operator<<(std::ostream& o, const Building &b)
{
return o << b.m_windows.size() << b.m_doors.size();
}
protected:
Windows m_windows;
Doors m_doors;
};

class Statue : public Structure
{
public:
friend std::ostream& operator<<(std::ostream& o, const Statue &s)
{
return o << s.m_type;
}
protected:
StatueType m_type;
};

int main(int argc, char* argv[])
{
Structure struct* = new Building();
std::cout << struct << std::endl;
return 0;
}

Error:
error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
std::cout << struct << std::endl;

编辑:

我已经在我自己的代码中隔离了这个问题,这里是一个可编译版本 (C11)。问题是我正在使用进一步的继承,我的命令输出是:

CORRECT_VALUE<random address>
8.8.8.80x804c504

我不确定为什么要附加那个随机地址?

http://pastebin.com/81ubU0yX

最佳答案

创建一个虚拟输出函数并在 operator << 中调用它.在您的派生类中覆盖此输出函数。

class Structure
{
public:
virtual ~Structure() {}
virtual std::ostream& StreamOut(std::ostream& o) const { return o; }

friend std::ostream& operator<<(std::ostream& o, const Structure &s)
{
return s.StreamOut(o);
}
};

class Building : public Structure
{
public:
virtual std::ostream& StreamOut(std::ostream& o) const
{
return o << m_windows.size() << m_doors.size();
}
protected:
Windows m_windows;
Doors m_doors;
};

class Statue : public Structure
{
public:
virtual std::ostream& StreamOut(std::ostream& o) const
{
return o << m_type;
}
protected:
StatueType m_type;
};

int main(int argc, char* argv[])
{
std::unique_ptr<Structure> myStruct(new Building());
std::cout << *myStruct << std::endl;
}

关于C++ 继承运算符<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29129907/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com