2017-12-06 4 views
0

オブジェクトを作成するタスクがありますStosオブジェクトのヒープを持つオブジェクトObiektがありました。オブジェクトポインタのベクトルが奇数を返します

プログラムが動的配列をより良くサポートするために、私はVectorを使うことにしました。 実装全体が完全に実行されているようですが、戻り値は完全にオフです。

class Obiekt { 
private: 
    int id; 

public: 
    Obiekt::Obiekt(int i) { 
     id = i; 
    } 

    void Obiekt::display() { 
     cout << "This object has id of: " << id << endl; 
    } 
}; 

class Stos { 
private: 
    vector < Obiekt* > stos; 
public: 
    Stos::Stos(Obiekt n) { 
     add(n); 
    } 

    void Stos::add(Obiekt n) { 
     stos.push_back(&n); 
    } 

    void Stos::display() { 
     cout << endl << "===HEAP DISPLAY===" << endl; 
     for (int i = 0; i < stos.size(); i++) { 
      stos[i]->display(); 
     } 
    } 
}; 

void Zad1() 
{ 
    Obiekt obj1(5); 
    Obiekt obj2(23); 

    Stos s1(obj1); 
    s1.add(obj2); 
    s1.display(); 

    getchar(); 
} 

と結果のビーイング:ここ コード付き例で-858993460

=== HEAP表示===

このオブジェクトのIDを有していますこのオブジェクトのID:9805925

私はそうではありませんcppのエキスパートであり、この問題はstos.push_back(&n)部分に関連していると考えていますが、IDがひどく歪んだ瞬間を捉えることはできません。

これはおそらくノブの質問ですので、始めに申し訳ありません。

何か助けが素晴らしいだろう。

+0

が働い!!ありがとう。これを回答として投稿できますか? – aln447

+0

投稿されました:) –

+0

最も簡単な解決策は、ベクトルをベクトル< Obiekt > stos;にすることです。 –

答えて

1

パラメータは

Stos::Stos(Obiekt n) { 
    add(n); 
} 

void Stos::add(Obiekt n) { 
    stos.push_back(&n); 
} 

Obiekt nは、各コールの後にすぐに破壊され、一時的なコピーです。

代わりに参照Obiekt & n、またはそれ以上のものを使用する必要があります。ポインタObiekt * n

+3

パラメータが参照渡しであれば、そのアドレスは呼び出しを超えて格納されるべきではないので、これは良いスタイルではありません。 –

3

Obiektオブジェクトのコピーへのポインタを追加していることが、O'Neilのコードで正しく説明されています。したがって、基本的には、メインにオブジェクトを作成し、それをコンストラクタとStosの.add関数に渡します。 ポインタをベクターに追加します。関数が終了すると、渡されたコピーが破棄され、ベクター内のポインタがぶら下がっています。 これを修正するには、2つの方法があります。

1パスを参照

でこれは非常に単純ですが、基本的にはあなたは自分の関数パラメータにアンパサンドを追加します。例えば:

void Stos::add(Obiekt &n) { 
    stos.push_back(&n); 
} 

これは、オブジェクトが機能

2の終わりに破壊されないことを保証します仕事にあなたの問題を得るための別の方法はにあるポインタ

を使用しないでくださいポインタをまったく使用しないでください。あなたのベクトルは実際にObiektオブジェクトの内容をその中にコピーします。たとえば、

vector <Obiekt> stos; // notice how we define it without the pointer type 

...

void Stos::add(Obiekt n) { 
    stos.push_back(n); // Creates copy which will then contain the correct value 
} 
+0

タスク要件は配列がクラスポインタ型の場合 – aln447

+0

Gotcha。 M.Mは正しいですが、参照の代わりにポインタの値を渡す必要があります –

0

表示時にオブジェクトが存在すると主張するのは嫌です。

問題

GCCの実装によれば、これらはありません。 範囲外になり、すぐに破棄されます。 「Obiektに」非自明なデストラクタを与え、この挙動が明らかになった:

~Obiekt(){std::cout << "Bye from: " << it << std::endl;} 

第二に、あなたは、クラス自体の中で定義された関数のクラスのメンバーシップを(指定されていなければならないことに注意していないCLASS_NAME :: FUNCTION_NAME(パラメータ)あなたは()ことを変える "STOS" などにしたいかもしれませんが、ちょうどFUNCTION_NAME(パラメータ))

可能性を修正しまし

:オニール@

Stos(Obiekt &n) {add(n);} 
void add(Obiekt &n) {stos.push_back(&n);} 
関連する問題