gpt4 book ai didi

C++:派生类中的运算符<<具有默认参数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:54:43 26 4
gpt4 key购买 nike

类 A 具有虚方法 print() 和重载运算符 << 定义为友元函数。

#include <iostream>
class A
{
public:
double a1, a2;
A(): a1(10.0), a2(10.0) {}

virtual void print ( std::ostream * o = &std::cout ) const
{
*o << a1<< '\t' << a2 << '\n';
}

friend std::ostream & operator << ( std::ostream & o, const A &aa )
{
o << aa.a1 << '\t' << aa.a2 << '\n';
return o;
}
};

类似地在派生类 B 中

 class B : public A
{
public:
double b1, b2;
B(): A(), b1(20.0), b2(20.0) {}

virtual void print ( std::ostream * o = &std::cout ) const
{
A::print ( o );
*o << b1<< '\t' << b2;
}

friend std::ostream & operator << ( std::ostream & o, const B &bb )
{
o << (A)(bb);
o << bb.b1 << '\t' << bb.b2 << '\n';
return o;
}
};

我有以下问题:

1] 有什么方法可以将指针传递给带有默认参数的 ostream 对象,以便 operator << 正确替换 print() 方法?这种重载是错误的

friend std::ostream & operator << ( std::ostream * o= &std::cout, const A &aa )

2]我不确定,这行调用派生类B中父类A的运算符是否正确?

 o << (A)(bb);

3] 有没有更好的方法如何在没有“ friend ”声明的情况下重载运算符 <<?

感谢您的帮助....

最佳答案

没有友元你也可以这样做:

#include <iostream>
class A
{
double a1, a2;

public:
A(): a1(10.0), a2(10.0) {}

virtual void print ( std::ostream * o = &std::cout ) const
{
*o << a1 << '\t' << a2;
}
};

std::ostream & operator << ( std::ostream & o, const A &aa )
{
o << "( )";
aa.print(&o);
return o << " )";
}

然后 class B不是 operator<< 的单独版本, 这个会被找到,然后调用B::print当你传递一个 B实例。

关于C++:派生类中的运算符<<具有默认参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11594853/

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