gpt4 book ai didi

c++ - 循环依赖与可以相互初始化的类

转载 作者:行者123 更新时间:2023-11-28 02:09:51 26 4
gpt4 key购买 nike

嗯,这个问题的正确标题应该是“循环依赖与类的实例可以相互初始化”。

我有两个类(具有整数数据字段的 Index3i 和具有 float 据字段的 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++ - 循环依赖与可以相互初始化的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36102092/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com