我有一个“Foo.cpp”类和一个“Bar.cpp”类。我想在Foo的两个参数上重载+运算符,以便添加两个Foos返回一个Bar,其值为其值的乘积。代码看起来像
//Foo.h
class Foo
{
public:
double foo_val;
Foo();
Foo(double);
};
Bar* operator+ (Foo&, Foo&)
//Foo.cpp
#include "Foo.h"
Foo::Foo(){foo_val = 0;}
Foo::Foo(double d){foo_val = d;}
Bar* operator+ (Foo& f1, Foo& f2){
return new Bar(f1.foo_val*f2.foo_val);
}
#include "Foo.h"
#include "Bar.h"
int main(){
Foo f1 = new Foo(4, 5);
Foo f2 = new Foo(1, 2);
Bar = f1+f2;
}
Bar目前与Foo基本相同,它有一个构造函数“Bar(double);”
目前它不起作用,我认为因为Bar在我尝试制作新的之前尚未定义。 (编译器错误是“'Bar'没有命名类型”)但是,我知道我无法在顶部转发声明Bar,因为这只适用于指针,而我正在尝试构建一个新指针。有没有办法让这种类型的东西工作,或者我是否完全错了?
谢谢!
答案 0 :(得分:2)
实际上非常简单。在Foo.h
中,您需要转发声明 class Bar
,以便operator+
的声明有效:
class Bar;
class Foo
{
// ...
};
Bar* operator+ (Foo& f1, Foo& f2);
然后,在Foo.cpp
中,您需要include Bar.h
,因为在这里您真的需要知道如何声明Bar
:
#include "Foo.h"
#include "Bar.h"
// ...
Bar* operator+ (Foo& f1, Foo& f2)
{
// Now you can use Bar's constructor
return new Bar(...);
}
答案 1 :(得分:0)
有两种选择。
(1)放
#include "Bar.h"
在Foo.h
的开头。但如果Bar.h
已经有#include "Foo.h"
,这将导致循环依赖,因此 是一个可行的选项。
(2)放
class Bar;
Foo.h
中的,在Foo
的类定义之前。