我实现了以下类:
class NUMS {
int* numbers;
int size;
public:
ostream& operator << (ostream& out, NUMS const& nums) {
for (int i = 0; i < size; ++i) out << nums.numbers[i] << " \n";
return out;
}
};
class A
class B : public A {
NUMS* numbers;
public:
C& func() {
C* c = new C();
return *c;
}
ostream& operator << (ostream& out, B const& b) {
for (int i = 0; i < b.numbers->get_size(); ++i) out << b.numbers[i];
return out;
}
};
class C : public B
在我的main
:
A* a = new B();
B& b = a->func();
cout << a;
cout << b;
ostream运算符在cout << b
不起作用。我的问题是什么?
答案 0 :(得分:1)
首先,您的operator <<
重载应该是全局运算符,它也应该是类的friend
,因此它可以访问类的私有数据成员:
friend ostream& operator << (ostream& out, NUMS const& nums)
{
// ...
}
同样适用于<<
中的B
重载。
你很可能在func
中得到未定义的行为,但我认为你应该做的是删除代码中的所有指针实例和new
,因为它们不需要。 new
不用于创建类的实例,它实际上是分配动态内存。
您的func
方法可能会返回堆栈分配的A
实例:
C func()
{
return C();
}
它还应该通过- value 返回它,因为通过引用返回会在结束括号后立即引起悬空引用,因为临时对象已经被销毁了。
我认为你对以下几行正在做的事感到困惑:
cout << a;
cout << b;
第一个打印出指针的值(即地址)。在这种情况下,它不会调用任何运算符重载。由于前面的行不正确,编译器甚至不会打印b
。
如果您希望cout << b
正常工作,则必须更改初始化方式。由此:
B& b = a->func();
简单地
B b;
从那里打印b
应该有效。我不确定你要对a->func()
或C
课程做些什么,我认为你的课程中没有任何理由。