2013-10-27 28 views
2

我有一个“Foo.cpp”类和一个“Bar.cpp”类。我想在Foo的两个参数上重载+操作符,以便添加两个Foos返回一个Bar,其值是它们值的乘积。该代码看起来像C++从类中的函数实例化不同的类

//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'没有命名一个类型”)但是,我知道我不能在前面转发declare Bar,因为它只能用于指针,而我正在尝试构建一个新的。有什么方法可以让这种类型的东西起作用,或者我是否完全错误?

谢谢!

+0

我认为像这样定义运算符+函数可能会更好:Bar运算符+(const Foo&f1,const Foo&f2)。否则,你应该跟踪Bar *,并且不能做出像f1 + f2 + B2这样的东西。看看这个页面http://users.cms.caltech.edu/~donnie/cs11/cpp/cpp-ops.html – phoad

回答

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(...); 
} 
0

有两种选择。

(1)把

#include "Bar.h" 

Foo.h开始。但如果Bar.h已经有#include "Foo.h",这将导致循环依赖,所以这是而不是一个可行的选择。

(2)将

class Bar; 

Foo.h,的Foo类定义之前。

+0

为什么(1)首选?你应该总是喜欢头文件中的前向声明,因为它可以节省编译时间。 –

+0

好问题。除了这是我一直以来做的事,我没有别的理由。我删除了该偏好。 (但是我相信编译时间是可以忽略的,但是,如果你确保头文件只包含一次。) –

+0

@FerdinandBeyer在这里保存编译时间是最不重要的。将标题包含在另一个标题中,可以创建它们之间的依赖关系,这从SW工程的角度来看是错误的(除非依赖关系是真实的和设计的)。 – SomeWittyUsername