额外的代码行只能添加到出现“ >>”符号的位置。 我的目标输入和输出如下:
输入: 15
输出: 16:15:17:16:
我仅需要
cout << r.get() << ":";
部分。一个解释会有所帮助。
#include <iostream>
using namespace std;
class A {
int i;
public:
A(int ai) : i(ai) {}
int get() const { return i; }
void update() { ++i; }
};
class B {
int i;
public:
B(int ai) : i(ai) {}
int get() const { return i; }
//>>
operator A() {return A(i);}
void update() { ++i; }
}; // End of class B
int main() {
int i;
cin >> i;
A a(i++);
B b(i);
const B &r = static_cast<B>(a);
a.update();
cout << a.get() << ":";
cout << r.get() << ":";
const A &s = static_cast<A>(b);
b.update();
cout << b.get() << ":";
cout << s.get() << ":";
return 0;
}
答案 0 :(得分:2)
您无法通过修改类B
中的转换运算符来解决提问者的问题。 B
的转换运算符仅告诉构造函数如何从B
生成另一个数据类型。要使用转换运算符执行此操作,该运算符必须位于类A
中。
class B; // forward declaration of B so that A knows it exists
class A
{
int i;
public:
A(int ai) :
i(ai)
{
}
int get() const
{
return i;
}
void update()
{
++i;
}
operator B(); // cannot implement the function yet because we do not have a
// complete definition of B. Without a definition of B we cannot
// construct B excluding forward defined helper functions that are
// implemented later, gaining us nothing.
};
然后在B
被完全定义之后,
A::operator B()
{
return B(i); // now we have enough information to construct a B
}
注意:我们可以通过将B
的定义移到A
的定义之前来减少这种混乱。不幸的是,这使得支持
const A &s = static_cast<A>(b);
代码后面的要求A
的正向声明,以及B
定义之外的A
至B
转换操作符的实现。
另一种选择是向B
添加一个使用A
B::B(const A& a): i(a.get())
{
}
,反之亦然,A
。