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颜色库的宏,因为这会导致许多不必要的对象重复,并且我宁愿保持它始终引用相同的全局实例颜色被重复使用.
正如您所知,C++标准没有定义调用不同翻译单元中构造函数的顺序.
但是大多数C++实现通常都提供了指定构造函数初始化顺序的方法,您可以利用它来获得优势.
例如,gcc具有init_priority属性,您可以将该属性附加到构造函数,并控制构造函数相对于其他构造函数的初始化顺序.这可能是gcc案例中的答案.
查看编译器的文档,以获取有关它在此区域中提供的特定于编译器的功能的更多信息.
对于更加可移植的方法,可能可以对POD在命名空间范围内的非平凡类实例之前初始化这一事实做一些事情.有可能利用这个,以便在这里提出一些方法,但我建议首先调查你的编译器的能力.利用编译器为您提供的其他功能没有任何问题.
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |