这是宣言:
class a{
public:
void print_fib(int x){
printf("%d\n",b::getfib(x));
};
};
class b{
public:
void init(); //calculate the Fibonacci numbers, save them in `fib[]`
int getfib(int x);
private:
int fib[10];
};
class c{
private:
a ca;
b cb;
};
如何从cb.getfib()
访问ca.print_fib()
?
答案 0 :(得分:1)
重新订购,否则转发声明
class b{
public:
bb();
};
class a{
public:
aa(b& inst);
};
class c{
private:
a ca;
b cb;
public:
void foo()
{
ca.aa(cb);
}
};
// implement here
void a::aa(b& inst)
{
// do stuff
b.bb(); // voila
}
更好的设计决策可能是在b::bb()
中执行c::foo()
并将结果传递给a::aa()
..然后它们可以是独立的......
答案 1 :(得分:0)
如果所有三个类都在同一个文件中,那么你的代码应该可以正常工作。
但是,如果您有单独的头文件,请将这些头文件包含在包含class C
的文件中。
更喜欢Ed Heal对我的回答的评论。
答案 2 :(得分:0)
如果您将this
传递给ca和cb,则可以分别使用它来访问cb和ca.
class a {
public:
a(c *parent) : _parent(parent) {}
aa() { parent->cb.bb(); }
private:
c *_parent;
};
class c {
public:
c() : ca(this), cb(this) {}
...
答案 3 :(得分:0)
我现在在代码中看到的主要问题是从b::getfib(x)
调用a::print_fib
,这不是进行此调用的正确方法。
b中的函数不是静态的,除非“缓存”也是静态的,否则不能是静态的。因此,要调用它,您需要一个b的实例(您在c中有)。你可以把它传递给你的函数,但实际上在这种情况下我不明白为什么你需要b的多个实例。
另请注意,从您的代码中,b尚未在a的标头中声明。您的代码必须重新排列,以确保正确处理依赖关系。