2

いくつかの列挙型をクラスでラップしたい場合、例えばいくつかの関数を構築するために、次のような状況になる可能性があります:

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" の初期化に違いはありますか?

4

2 に答える 2

1

ZeroEnum と OneEnum の定数は、WrappedZero と WrappedOne の前に初期化されることが保証されていますか、それとも幸運でしたか?

これらはコンパイル時の定数であるため、実行時にはまったく初期化されません。いつでも安全に使用できます。

列挙型定数 (ZeroEnum や OneEnum など) とグローバルな "static const int" の初期化に違いはありますか?

が定数値で初期化されている場合、static const intその値を知っているコードではコンパイル時の定数になります。それ以外の場合、プログラムが開始する前の静的初期化フェーズで初期化されます。どちらの場合でも、いつでも安全に使用できます。

実行時の値で初期化する必要がある場合は、動的な初期化フェーズ (「ラップされた」オブジェクトなど) で初期化されるため、初期化の順序で問題が発生する可能性があります。

于 2013-09-13T16:42:02.390 に答える
0

はい、違いがあります。

インスタンス内の enum 型のフィールドは、コンパイル時に不明なコンパイラ用であるため、コードを生成するときに実際にインスタンスにアクセスして値を見つける必要があり、生成されたコードは大きくなり遅くなります。

代わりに、コンパイル時にAconst int を知ることができるため (定数で初期化する場合)、コンパイラは値を直接使用するコードを生成できます (また、配列宣言やテンプレートなどで定数式として使用することもできます)。

また、静的期間インスタンスで値をラップすると、初期化の順序が保証されないため、他の静的期間インスタンスの初期化中にラップされた値を誰が使用するかという問題が発生することに注意してください。

必要なものが入った箱をバッグに包むのがいいと思う理由がよくわかりません. より多くのコードを記述し、コンパイラとユーザーを悩ませることを除いて、それを行うことでどんな良いことを達成できますか?

于 2013-09-13T16:46:24.520 に答える