3

私はC++で次のクラスを持っています

class MyClass {

public:
  bool flag;

  MyClass (bool flag = false) {
    this->flag = flag;
  }
...
};

私のメイン(テストに使用)には、そのようなものがあります

int main() {
 MyClass number1 = MyClass(true);
 MyClass number2 = MyClass(false);
 MyClass number3 = new MyClass(false);
 MyClass number4 = new MyClass(true);
 MyClass number5 = new MyClass();
 std::cout << number1.flag << number2.flag << std::endl;
 std::cout << number3.flag << number4. flag << number5.flag << std::endl;
}

そして私の出力(ブール出力がtrueまたはfalseであり、出力がより適切にフォーマットされていると想像してください)

true, false 
true, true, true

問題は、「new」キーワードを使用して「MyClass」オブジェクトを作成すると、引数コンストラクターに何を入れたか、何を入れなかったかに関係なく、常にフラグ変数がtrueに設定されることです。

これは、「new」を使用していないコンストラクターに対しては機能しますが、それを使用しているコンストラクターに対しては機能しません。キーワードnewを使用する場合と使用しない場合の唯一の本当の違いは、使用しない場合は変数がスタック上に作成され、使用しない場合はヒープ上に作成されることです。これがうまくいかない可能性があるとは思いません。

正しく動作させたい場合、何を変更する必要がありますか?クラスには、フラグ変数を正常に変更できる他のメソッドがありますが、初期化しても機能しません。また、メンバー初期化リストを使用して変数を作成しようとしましたが、それも機能しません。

ご協力いただきありがとうございます!

編集:これがコンパイルを行うコードです。Test.c++とAbstractCell.hの2つのファイルがあります。AbstractCellはMyClassであり、このコードを実行すると、「isAlive:1」が出力されます。

 void test_abstract_2(){
   AbstractCell one = new AbstractCell();

      std::cout << std::endl <<  "isAlive:  " << one.alive << std::endl;

  }
4

2 に答える 2

7

によって返されるポインタnewは暗黙的にに変換されbool、次にに渡されMyClass(bool)ます。

言い換えれば、次のようになります。

MyClass number3 = new MyClass(false);

と同等です:

MyClass number3(bool(new MyClass(false)));

によって返されるポインタnewがnullになることはないため、変換では常に、が生成されます。これは、のコンストラクタtrueに渡されるものです。number3新しく割り当てられたポインタがリークされます。

あなたはおそらく言うつもりだった:

 MyClass* number3 = new MyClass(false);
 MyClass* number4 = new MyClass(true);
 MyClass* number5 = new MyClass();

(アスタリスクに注意してください。)

コンストラクターを宣言した場合、この問題は発生しなかったでしょうexplicit

  explicit MyClass (bool flag = false) {
    this->flag = flag;
  }

コードはコンパイルに失敗し、何かが間違っていることがすぐにわかります。

于 2012-11-27T21:17:44.953 に答える
0

そこには2つの問題があります。

1つ目はnew、静的オブジェクトではなく、ポインタを返すことです。通常、次のように使用します。

MyClass* number3 = new MyClass(false);
std::cout<<std::boolalpha<<number3->flag<<std::endl;  //outputs 'false'
...  //do more stuff with number3
delete number3;

2番目の問題は、コードが記述どおりにコンパイルされることです。編集済み:コードは通常、記述どおりにコンパイルされるべきではないと思いましたが、間違っていたと思います。C++では暗黙的にboolに変換できるものが多すぎるようです。

だから私はそれを修正し、2番目の問題は破壊されない匿名の一時的な動的オブジェクトを構築することによってコードがメモリリークすることだと言います:)

于 2012-11-27T21:22:41.240 に答える