C++ 实例化与类中的函数不同的类

C++ Instantiating a different class from a function in a class

本文关键字:函数 实例化 C++      更新时间:2023-10-16

我有一个"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,因为这仅适用于指针,而我正在尝试构建一个新的指针。有没有办法让这种事情发挥作用,还是我完全错了?

谢谢!

这其实很简单。 在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) 把

#include "Bar.h"

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

(2)把

class Bar;

Foo.h,在类定义之前Foo