与可以一个从另一个初始化的类的循环依赖关系
Circular dependency with classes that can be initialized one from another
好吧,这个问题的正确标题应该是"与类的循环依赖关系,这些类的实例可以一个一个地初始化"。
我有两个类(带有整数数据字段的 Index3i 和带有浮点数据字段的 Index3f),它们意味着可以"转换"到另一个,反之亦然:
文件 "Index3i.h":
// #include "Index3f.h"
class Index3i {
public:
Index3i()
: r(0), g(0), b(0) { }
Index3i(const Index3i& copy)
: r(copy.r), g(copy.g), b(copy.b) { }
// Index3i(const Index3f& copy)
// : r((int)copy.r), g((int)copy.g), b((int)copy.b) { }
// Index3f toIndex3f() { ... }
...
};
文件 "Index3f.h":
// #include "Index3i.h"
class Index3f {
public:
Index3f()
: r(0.0f), g(0.0f), b(0.0f) { }
Index3f(const Index3f& copy)
: r(copy.r), g(copy.g), b(copy.b) { }
// Index3f(const Index3i& copy)
// : r((float)copy.r), g((float)copy.g), b((float)copy.b) { }
// Index3i toIndex3i() { ... }
...
};
我需要类Index3i
对象能够初始化并转换为类Index3f
的对象,反之亦然。另外,我只想保留这些类标题。
好吧,如果我尝试取消注释的构造函数,方法和包含,这将创建一个循环依赖问题。另一种可能的解决方案是实现一些转换函数,并将它们放在第三个包含文件中,如"IndexConvert.h"左右。
但也许还有其他方法?您能否为我建议一个合适的解决方案?
将它们都变成一个类模板 - 听起来您实际上不需要有两个不同的类。这样,您只需编写一个转换构造函数模板:
template <class T>
class Index3 {
T r, g, b;
public:
Index3() : r(0), g(0), b(0) { }
Index3(const Index3&) = default;
template <class U, class = std::enable_if_t<std::is_convertible<U, T>::value>>
Index3(const Index3<U>& rhs)
: r(rhs.r), g(rhs.g), b(rhs.b)
{ }
/* rest */
};
相关文章:
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- C++:将初始化的对象传递给另一个类的构造函数;需要不必要的构造函数吗?
- 将另一个类的对象传递到当前类C++的构造函数中(不是成员初始化)
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 初始化类中的指针数组,并在另一个类中检索它
- C++ 警告:在一个声明中将截断从双精度初始化为浮点数,但在另一个声明中则不初始化
- C++入门5版:使用get成员初始化另一个与shared_ptr无关的对象
- 如何使用构造函数初始化另一个类的对象
- 初始化另一个类中的类的对象
- 用参数初始化另一类构造函数中的对象
- 如何编写两个初始化操作(一个作为默认初始化,另一个作为用户输入)?两者都是类的构造函数C++
- 我可以初始化另一个类中的类吗?
- 数组初始化需要一个包含大括号的初始值设定项列表lambda
- 当用于初始化另一个对象时,为什么要按值传递参数
- 不能在c++中从main实例化另一个类
- 将一个类的默认值初始化为另一个c++
- (复制构造函数)作为参数传递给初始化另一个对象的对象如何访问私有成员
- POD结构体的值初始化是一个constexpr
- 保存一个对象的变量,然后可以用这些变量初始化另一个对象
- 初始化另一个变量或反复使用原始变量