0

まず、「オブジェクト++」を実行してクラスの配列がいっぱいになったときにサイズを変更したいのですが、C++プログラムを実行すると「セグメンテーション違反(コアダンプ)」エラーが発生しました。問題は operator++ オーバーロード メソッド内にあります。最初の配列の内容を一時オブジェクトにコピーし (operator= のオーバーロードは既に行われており、うまく機能しています)、配列の高さと幅を変更し、最後にオブジェクト内の一時オブジェクトを再びコピーすることになっています。戻ってきた。「* this = * tmpPlateau ;」とコメントすると 配列のサイズは変更されますが、内容はコピーされません。コードは次のとおりです。

Plateau& Plateau::operator++() {

      // New sizes
      int newHauteur = this->height + 2 ; 
      int newLargeur = this->width + 2 ; 

      // Tableau temporaire avec le contenu du plateau actuel
      Plateau* tmpPlateau = this ;      

      // Actualisation des dimensions 
      this->height = newHauteur ; 
      this->width = newLargeur ;

      this->plateau = new Etat*[height] ; 
      for (int i = 0; i < height; i++) {

        plateau[i] = new Etat[width] ;

      }

      *this = *tmpPlateau ;     

      return *this ;
}

operator= オーバーロード メソッド :

Plateau& Plateau::operator=(const Plateau& tab) {

      this->plateau = new Etat*[height] ; 
      for (int i = 0; i < height; i++) {

            this->plateau[i] = tab.plateau[i] ; 

       }

       Plateau(height, width) ;
}
4

1 に答える 1

2

問題は二重だと思います。

まず、tmpPlateau独立したオブジェクトではありません。これは、次への単なる別のポインター*thisです。

  Plateau* tmpPlateau = this ;      

その結果、次の呼び出しoperator=()*this引数として次のようになります。

  *this = *tmpPlateau ;   

operator=()自己割り当てを正しく処理していないため、クラッシュが発生したと思われます。

ただし、実際の問題は、オブジェクトへのポインターではなく、オブジェクトのコピーtmpPlateauを保持する必要があることです。

std::vector最後に、配列の代わりに使用すると、クラスの実装がはるかに簡単になります。これにより、成長がはるかに容易になりますplateau

于 2013-01-19T12:30:41.880 に答える