-1

メイン クラスには person オブジェクトがあり、この person クラスには Strategy オブジェクトへのポインターが含まれています。私はこれをやろうとしています:

person.strategyPointer->getStrategyType()

しかし、これを印刷すると、特別な番号 3435973836 が表示されます。これはおそらく、strategyPointer が初期化されていないことを意味します。

Person クラスのヘッダー ファイルで、次のように宣言します。

Strategy* strategyPointer;

そして、Person.cpp ファイルで、このようにポインターを初期化します。

Person::Person()
    : strategyPointer(nullptr)
{
}

ポインターを null にポイントすると、なぜコンパイラーは、strategyPointer が初期化されていないと不平を言うのですか? それとも、null を指しているため、範囲外になり、削除されますか? 私は実際に解析しているときにポインターを何かに向けます。私はこのようなことをします:

StrategyType newStrat;
newStrat.setStrategyType(strategyType);
    person.strategyPointer = &newStrat

私は継承を使用しており、Strategy は私の基本クラスです。ただし、後でメイン ソース ファイルに戻って初期化について文句を言います。この初期化の問題で何が起こっているのかわかりません。偽の Strategy オブジェクトへのポインターを指すこともできません。

編集: Person ヘッダー ファイル Strategy newStrategy; に新しい変数宣言を追加しました。後で、作成した StrategyType オブジェクトを newStrategy に割り当て、strategyPointer を &newStrategy にポイントします。これにより、作成した StrategyType オブジェクトが範囲外になるのを防ぐことができますよね? しかし、私の main.cpp では、 person.stratPointer->getStrategyType(); を印刷しようとすると、同じ値が得られます。ただし、person.newStrategy.getStrategyType() を出力すると、必要な値が得られます。

4

1 に答える 1

2

NULL ポインターを逆参照することが意図されていない限り (そうである場合は、頭を調べてください)、「初期化済み」の定義はnullptr、 Person コンストラクターの初期化子リストにポインターを設定してその値を回避するという意味でのみ正確です。不確定であること。

とはいえ、これは?

StrategyType newStrat;
newStrat.setStrategyType(strategyType);
person.strategyPointer = &newStrat;

これがどこかの関数内にある場合 (そして確かにそうである必要があります)、newStrat関数の戻り、ループの終了などでその瞬間が範囲外になると、personオブジェクトは未定義の動作を参照するようになります。また、スタックマーカーが結果値として表示される理由も説明します。

StrategyType を Person の値プロパティにし、次のように初期化します。

person.strategy.setStrategyType(strategyType);

または、次のようにします。

class Person
{
   ...
   StrategyType strategy;

public:
   void setStrategyType(StrategyType type)
   {
       strategyType.setStrategyType(type);
   }
};
于 2012-11-17T08:18:21.987 に答える