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

Maj*_*nko 5 c++ constructor global

我有一个构造函数订购问题,我正在尝试提出创造性的解决方法.

基本上我有一个简单的类Color,它存储RGB颜色信息,并允许操纵所述颜色和转换到其他颜色空间(24位,16位,4位,HSV,XYZ,LAB等).班级本身工作得很好.

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

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);
};
Run Code Online (Sandbox Code Playgroud)

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

当我尝试将构造函数中的库颜色用于另一个对象时,我的问题出现了.没有什么可说的,我使用的库颜色的构造函数已被执行,并且在接收到的另一个类的构造函数之前分配了颜色数据(它进行了一些小的预处理以计算一些不同的颜色空间值)Color对象并将其分配给自身内部的存储变量.

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

Color(const Color &c) {
    setColor(c.getRed(), c.getGreen(), c.getBlue());
}
Run Code Online (Sandbox Code Playgroud)

还有一个=运营商:

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

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

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

Color _storeColor;
TestClass(const Color &c) {
    _storeColor = c;
}
Run Code Online (Sandbox Code Playgroud)

要么:

Color _storeColor;
TestClass(const Color &c) : _storeColor(c) {}
Run Code Online (Sandbox Code Playgroud)

有:

TestClass myTest(Colors::WhiteSmoke);
Run Code Online (Sandbox Code Playgroud)

分配的颜色数据(几乎总是)0就好像Color该类的构造函数尚未运行,我完全得到了.

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

顺便说一句,像:

TestClass myTest(Color(245,245,245));
Run Code Online (Sandbox Code Playgroud)

尽管我不希望有数百个(并且它是数百个)或#define颜色库的宏,因为这会导致许多不必要的对象重复,并且我宁愿保持它始终引用相同的全局实例颜色被重复使用.

Sam*_*hik 5

正如您所知,C++标准没有定义调用不同翻译单元中构造函数的顺序.

但是大多数C++实现通常都提供了指定构造函数初始化顺序的方法,您可以利用它来获得优势.

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

查看编译器的文档,以获取有关它在此区域中提供的特定于编译器的功能的更多信息.

对于更加可移植的方法,可能可以对POD在命名空间范围内的非平凡类实例之前初始化这一事实做一些事情.有可能利用这个,以便在这里提出一些方法,但我建议首先调查你的编译器的能力.利用编译器为您提供的其他功能没有任何问题.