在C ++中是否有可能有两个类,让我们称它们为A
和B
,这样A
有一个返回类对象的成员函数f
B
,B
有一个成员函数g
,它返回类A
的对象?
(以下文字只是为了表明我“完成了我的作业”。)
问题是当第一个定义的类中的一个具有不完整的返回类型时,如何编写这些函数的签名。前向声明在这里没有帮助,因为对象是按值返回的。
是的,我知道所有的变通方法(朋友全局函数,通过指针返回......),但我想知道上面的接口是否可以用C ++实现。为了举个例子,假设我试图在类A
上重载operator()以返回B
,并在类B
上重新返回A
。由于我正在重载运算符,我必须按值返回(好吧,除非我想要动态分配地狱:),并且()必须作为成员函数重载,所以我不能使用全局朋友。
答案 0 :(得分:7)
是,在您声明class A
class B
的功能定义
class B;
class A
{
B f();
};
class B
{
A g() { A a; return a; }
};
B A::f(){ B b; return b; }
答案 1 :(得分:0)
打破依赖循环的另一种可能方法是使用模板成员函数,如下所示:
struct A {
template<typename T> T f() { return T(); }
};
struct B {
A g() { return A(); }
};
int main() {
A a;
B b = a.f<B>();
A a1 = b.g();
return 0;
}
它也适用于operator(),虽然调用语法会相当丑陋:a.operator()<B>()