2017-02-23 3 views
0

私は以前CやJavaで作業していましたが、私はC++を初めて使っています。次のコードでオブジェクト変数値のC++連続チェックは異なる結果をもたらしますか?

、I:

  • ポリゴンクラスを定義します。今のところそれだけで1つの変数があります。numpoints
  • は、オブジェクトが存在する場合は、ちょうどnumpointsの値を出力しますクリックイベントのハンドラを定義

  • ヌルだポリゴンオブジェクトへのグローバルポインタを作成します。そうでない場合は、それが最初のクリックした後、0

    //defining polygon class 
    class polygon{ 
    public: 
        int numpoints; 
    }; 
    
    //create a global pointer that's uninitialized 
    static polygon *current = NULL; 
    
    //define a click handler. 
    void leftClick(int x, int y){ 
        if (current==NULL){ 
         polygon newpoly; 
         current = &newpoly; 
         current->numpoints = 0; 
         printf("created new polygon\n"); 
         printf("%i points\n", (*current).numpoints); 
    
        }else{ 
    
         printf("polygon exists\n"); 
         printf("%i points\n", (*current).numpoints); 
        } 
    } 
    

するnumpointsの値を、それを作成して設定し、プログラムが

予想通り
created new polygon 
    0 points 

を印刷します。しかし、2回目以降のクリック後には、

polygon exists 
    -1567658064 points 

または他の一見乱数が印刷されます。誰がここで何が起こっているのか知っていますか?なぜ値が0にとどまっていないのですか?どんな助けもありがとうございます。

答えて

0

これは動作するはずです:

//defining polygon class 
class polygon{ 
public: 
    int numpoints; 
}; 

//create a global pointer that's uninitialized 
static polygon *current = NULL; 
polygon newpoly;  
//define a click handler. 
void leftClick(int x, int y){ 
    if (current==NULL){ 

     current = &newpoly; 
     current->numpoints = 0; 
     printf("created new polygon\n"); 
     printf("%i points\n", (*current).numpoints); 

    }else{ 

     printf("polygon exists\n"); 
     printf("%i points\n", (*current).numpoints); 
    } 
} 

問題は、それがスコープ外になるのでnewpolyが最初printf後に破壊されていることです。 C++でメモリをどのように管理するかを知る必要があります。

0

newpolyはローカル変数です。あなたはその住所を取っていますが、直ちに住所が消えてしまったので、それ以上感知できません。

あなたができることは、代わりに動的割り当てを使用することです:current = new polygon;


しかし、ダイナミックアロケーションを何らかの方法でラップすることなく使用することは、一般に悪いことです。

C++ 11を使用している場合は、ヘッダ<memory>std::unique_ptr<polygon>を使用できます。

結果が必要な場合は、この変更は、あなたの割り当てが正しくdelete Dであることを保証します

static std::unique_ptr<polygon> current; // No need to set it to NULL 
... 
current.reset(new polygon); 

です。

+0

これは非常に悪いアドバイスです。浮動小数点ポインタと非管理ポインタを作成することは正しい解決策ではありません。 –

+0

これは理想的ではないが、実用的な解決策です。 – Telokis

+0

初心者に助言を与える際には注意が必要です。あなたは、単に働くものを手に入れるのではなく、良いアドバイスをすることを目標にすべきです。少なくとも、これはこれとそれに起因する悪い解決策であると言えば、良い解決策はそうです。場合は、良い解決策を言及したい場合は、クラスでこれをラップし、削除の世話をするデストラクタを取得するか、クラス内のスマートポインタを使用することをお勧めします。 –

関連する問題