gpt4 book ai didi

c++ - 构造函数排序(全局范围)问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:16 24 4
gpt4 key购买 nike

我有一个构造函数排序问题,我正在尝试想出创造性的方法来解决。

基本上我有一个简单的类 Color,它存储 RGB 颜色信息并允许操作所述颜色并转换为其他颜色空间(24 位、16 位、4 位、HSV、XYZ、LAB、 ETC)。该类(class)本身运行良好。

我还有一个预定义颜色库,例如:

namespace Colors {
const Color Snow (255,250,250);
const Color GhostWhite (248,248,255);
const Color WhiteSmoke (245,245,245);
const Color Gainsboro (220,220,220);
const Color FloralWhite (255,250,240);
const Color OldLace (253,245,230);
const Color Linen (250,240,230);
const Color AntiqueWhite (250,235,215);
const Color PapayaWhip (255,239,213);
const Color BlanchedAlmond (255,235,205);
};

在程序中正常使用时,它们也都可以正常工作。

当我尝试将构造函数中的那些库颜色用于另一个对象时,我的问题就来了。没有什么可说的,我使用的库颜色的构造函数已经执行,并且在接收Color 对象并将其分配给自身内部的存储变量。

例如,Color 类有一个构造函数:

Color(const Color &c) {
setColor(c.getRed(), c.getGreen(), c.getBlue());
}

还有一个 = 运算符:

Color &Color::operator=(const Color &rhs) {
setColor(rhs.getRed(), rhs.getGreen(), rhs.getBlue());
return *this;
}

setColor() 只是一个小辅助函数,用于存储值并预先计算一些颜色空间替代值。

当我在另一个对象的构造函数中包含一个时,说:

Color _storeColor;
TestClass(const Color &c) {
_storeColor = c;
}

或:

Color _storeColor;
TestClass(const Color &c) : _storeColor(c) {}

与:

TestClass myTest(Colors::WhiteSmoke);

分配的颜色数据(几乎总是)全部为 0,就好像 Color 类的构造函数尚未运行,我完全理解。

因此,我正在寻找有关如何创建我的预定义颜色库的想法,以便它们可供全局范围内的其他构造函数使用。

顺便说一句,比如:

TestClass myTest(Color(245,245,245));

工作完美,虽然我不希望颜色库有数百个(而且是数百个)或 #define 宏,因为那会导致很多不必要的对象重复,我更喜欢每当重新使用颜色时,始终保持引用相同的全局实例。

最佳答案

如您所知,C++ 标准并未定义调用不同翻译单元中的构造函数的顺序。

但大多数 C++ 实现通常提供指定构造函数初始化顺序的方法,您可以利用它来发挥自己的优势。

例如,gcc 有 init_priority您可以附加到构造函数并控制构造函数相对于其他构造函数的初始化顺序的属性。这可能是 gcc 案例的答案。

查看您的编译器文档,了解有关它在该领域提供哪些特定于编译器的功能的更多信息。

对于一种更具可移植性的方法,可能会在命名空间范围内对 POD 在非平凡类实例之前进行初始化这一事实做一些事情。可能可以利用这一点,以便在这里提出一些方法,但我建议首先调查您的编译器的能力。利用编译器为您提供的附加功能并没有错。

关于c++ - 构造函数排序(全局范围)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31965251/

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