いくつかの列挙型をクラスでラップしたい場合、例えばいくつかの関数を構築するために、次のような状況になる可能性があります:
main.cpp:
#include "WrappedEnumConstants.h"
int main(int argc, char * argv[])
{
WrappedZero.print();
WrappedOne.print();
}
WrappedEnumConstants.h
#ifndef WRAPEDENUMCONSTANTS_H
#define WRAPEDENUMCONSTANTS_H
#include "WrappedEnum.h"
#include "InternalEnum.h"
static const WrappedEnum WrappedZero(ZeroEnum);
static const WrappedEnum WrappedOne(OneEnum);
#endif
WrappedEnum.h
#ifndef WRAPPEDENUM_H
#define WRAPPEDENUM_H
#include <iostream>
#include "InternalEnum.h"
class WrappedEnum
{
public:
WrappedEnum(InternalEnum a);
void print() const;
private:
InternalEnum a;
};
#endif
WrappedEnum.cpp
#include <iostream>
#include "WrappedEnum.h"
WrappedEnum::WrappedEnum(InternalEnum a) :
a(a)
{}
void WrappedEnum::print() const {
std::cout << "WrappedEnum: " << a << std::endl;
}
InternalEnum.h
#ifndef INTERNALENUM_H
#define INTERNALENUM_H
enum InternalEnum { ZeroEnum, OneEnum};
#endif
私が得る出力は期待通りです:
WrappedEnum: 0
WrappedEnum: 1
静的定数 WrappedZero および WrappedOne の初期化が安全かどうか疑問に思っています。ZeroEnum と OneEnum の定数は、WrappedZero と WrappedOne の前に初期化されることが保証されていますか、それとも幸運でしたか? 特に、多くのものがリンクされた大規模なプロジェクトで WrappedEnum を使用した場合、どのような落とし穴があるのでしょうか。見えますか?
列挙型定数 (ZeroEnum や OneEnum など) とグローバルな "static const int" の初期化に違いはありますか?