0

基本的には、2000 行の OOP スクリプトの動作中にある 2 行のコードに過ぎないので、私は愚かだと感じる問題で立ち往生しています。

本題に入る - さまざまな情報 (名前、住所、ID) を提供する Entity クラスがあります。問題は、ID mutator (セッター) が適切な値を設定しても (cout と戻り値でテスト)、アクセサーが常に 0 を返すことです。

// ID accessor
int Entity::ID() const {
    return _ID;     
}
// ID mutator
int& Entity::ID( int newID ) {
    if ( newID >= 0 ) {
        _ID = newID;
    }
    return _ID;
}

これが私のクラスです (ID( int ) メソッドは AgencyNetwork::createXXX() で呼び出され、すべての toStr() メソッドで (各クラスの最後で) 使用されます):

Entity.cppAgencyNetwork.cppAgent.cpp

解決済み:すべての operator= に ID mutator を追加するのを忘れていました。助けてくれたみんなに感謝します:)

4

2 に答える 2

4

最も顕著なのは、の代入演算子Entityが壊れていることです。

Entity& Entity::operator= ( const Entity& tocopy ) {
    delete this; // <<< don't do that 

    this -> name ( tocopy.name() );
    this -> address ( tocopy.address() );
    // <<< missing _ID

    return *this;
}
于 2012-01-16T19:20:14.623 に答える
0

魔法はありません。明白なバグがあります。それでは、トレースを使用しましょう。すべての「mutator」呼び出しをトレースします。mutator 呼び出し以外の方法で、誰も _ID フィールドにアクセスできないようにしてください。コンストラクター、コピー コンストラクター、コピー代入演算子、およびデストラクターの呼び出しもトレースします。次に、コードを実行し、トレース ログを追跡します。あなたの場合、すべてが明らかになると確信しています。

注: 実装で上記のメンバー関数の一部が欠落している場合は、トレーサー呼び出しのみで構成される本体を使用してそれらを定義する必要があります。

_IDクラス、特にフィールドを完全に制御できるようにするために、コンパイラに暗黙的なメンバー関数の生成を許可しないでください。

于 2012-01-16T19:26:00.087 に答える