5

在 C++ 中是否可以有两个类,我们称它们为Aand B,这样A有一个f返回 class 对象的成员函数B,并且B有一个g返回 class 对象的成员函数A

(下面的文字只是为了表明我已经“完成了我的作业”。)

问题只是如何编写这些函数的签名,当第一个定义的类中的函数将具有不完整的返回类型时。前向声明在这里没有帮助,因为对象是按值返回的。

是的,我知道所有的解决方法(朋友全局函数,通过指针返回,...),但我只想知道上面的接口是否可以在 C++ 中实现。举个例子,假设我试图在 class 上重载 operator()A以 return B,并在 class上重载Breturn A。由于我是重载运算符,所以我必须按值返回(好吧,除非我想要一个动态分配地狱:),并且 () 必须作为成员函数重载,所以我不能使用全局朋友。

4

2 回答 2

8

是的,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; }
于 2011-05-21T05:52:39.577 回答
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>()

于 2011-05-21T05:51:03.110 回答