C++ 实例化与类中的函数不同的类
C++ Instantiating a different class from a function in a class
我有一个"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
。
相关文章:
- 如何使用非默认构造函数实例化模板化类
- C++ - 使用另一个类的构造函数实例化一个对象
- 与参数匹配的友元模板函数实例化
- 在保证复制的世界中构造函数实例化
- SFINAE 和模板函数实例化:为什么在启用了 SFINAE 类型的函数参数中使用模板参数时无法推断模板参数?
- 防止复制构造函数实例化 C++11 类"deleting"
- 如何键入定义一个专门的 std::set 模板,使用特定的比较函数实例化
- 使用不同类型的模板函数实例化
- C 调用模板构造函数实例化
- 为什么很清楚模板函数实例化不会内联
- 模板函数实例化文件
- 模板函数实例化的可移植性问题
- 模板函数实例化 自定义数据类型的问题
- 模板类成员函数实例化
- C++.对象使用错误的构造函数实例化
- C++如何用参数化构造函数实例化对象
- 为什么无法使用复制构造函数实例化"non const"而可以在没有复制构造函数的情况下实例化配对?
- 双模板化函数实例化失败
- 延迟 crtp 基类中的成员函数实例化
- 如何根据容器的元素类型启用模板函数实例化