5

クラスがあり、const int変数を作成したいのですが、クラスのコンストラクターで変数の値を使用できません。

クラスの初期化メソッドで、値を取得します。そのメソッドで割り当てることはできますか?私はそれを一度だけ割り当てているので(constが言うように)なぜそれが機能しないのですか?

コードは次のとおりです[JustaProtoType]:

ファイル:ああ

Class A
{
  private :
  const long int iConstValue;

  public :
  A();
  initClassA();
}

ファイル:A.cpp

A::A()
{
 //CanNot initialize iConstValue (Don't have it)
}

A::initClassA(some params)
{
 // calculation according to params for iConstValue
 iConstValue = (some value)
}

これは機能していません。誰かが解決策を持っていますか?

注:制限があるため、コンストラクターでiconstValueの値を取得できません。だから、そうすることを提案しないでください。

4

5 に答える 5

12

小さな例:

class A
{
public:
  A():a(initial_value_of_a()) {}

private:
  const int a;
  int initial_value_of_a() { return 5; /* some computation here */ };
};
于 2012-07-20T08:45:41.683 に答える
5

const一度しか割り当てることができないという意味ではなく、constオブジェクトに割り当てることはできません。const変数は一度初期化され、その値は変更できません。したがって、コンストラクターで初期化すると、すべてのメンバーとベースが初期化された後、それを変更することはできません。

構築の値を取得できない場合は、変数をnon-constにして変更するか、実際のオブジェクトを構築するまでプレースホルダーを使用して、すべてのデータが得られるまで構築を遅らせることができます。

2段階の構築はコードの臭いであり、constメンバーとは確かに互換性がありません。

于 2012-07-20T08:34:08.133 に答える
4

const変数の値を変更できないため、これを行うことはできません。実行時initClassAまでに、constデータメンバーはすでに初期化されています(この場合はガベージ値に)。したがって、実際にデータメンバーを初期化できるのは、コンストラクター初期化子リストのある値だけです。

変数を1回だけ設定する場合は、const以外を作成し、1回だけ設定できるようにガードを追加できます。これはきれいではありませんが、うまくいくでしょう:

class A
{
  private :
   long int iValue;
   bool isInitialised;

  public :
  A() : iValue(0), isInitialized(false);
  bool initClassA() {
    if (isInitialized) return false;
    iValue = something:
    isInitialized = true;
    return true;
  }
}

ただし、初期化できるオブジェクトがあるかどうかはお勧めできません。オブジェクトは構築時にコヒーレント状態である必要があり、クライアントはこれらのオブジェクトが初期化されているかどうかを確認する必要はありません。

于 2012-07-20T08:29:40.720 に答える
0

設計を変更する必要があると思います。コンストラクターでconst変数の値を計算(または取得)する必要があります。後で値を設定する方法がないので。

于 2012-07-22T12:49:03.810 に答える
0

たぶんあなたができることは、intポインターを変更し、コンストラクターでこのポインターを受け取り、必要な場所にポインターを変更することです:P

しかし、それは同じ機能ではありません。なぜなら、それはconstであり、もはや値ではないポインターになるからです:/

于 2012-07-20T08:46:12.160 に答える