2017-11-06 13 views
-3

クラスのオブジェクトを別のクラスのベクトルに追加する方法。ベクトルを使用するクラスオブジェクトをpush_backします。

#include <iostream> 
#include <vector> 
#include <string> 

using namespace std; 

class info{ 
    private: 
     int id; 
     string name; 
    public: 
     info(int extId, string extName) { 
      this->id = extId; 
      this->name = extName; 
     } 
}; 

class db { 
    private: 
     vector<info> infoVector; 
    public: 
     void pushData(info * data) { 
      this->infoVector.push_back(&data); 
     } 
}; 

int main(){ 
    info * testData = new info(123, "nice"); 

    db database; 
    database.pushData(testData);  

    return 0; 
} 

私はinfoクラスのオブジェクトを作成しています。オブジェクトには、1つのintと1つのstringの変数が含まれています。それから私はdbオブジェクトを作成していて、そこにはtestDataオブジェクトを渡しています。

プロジェクトの作成中にエラーメッセージが表示されました。

main.cpp: In member function ‘void db::pushData(info*)’: 
main.cpp:23:44: error: no matching function for call to ‘std::vector<info>::push_back(info*&)’ 
      this->infoVector.push_back(data); 
              ^
In file included from /usr/include/c++/5/vector:64:0, 
       from main.cpp:2: 
/usr/include/c++/5/bits/stl_vector.h:913:7: note: candidate: void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = info; _Alloc = std::allocator<info>; std::vector<_Tp, _Alloc>::value_type = info] 
     push_back(const value_type& __x) 
    ^
/usr/include/c++/5/bits/stl_vector.h:913:7: note: no known conversion for argument 1 from ‘info*’ to ‘const value_type& {aka const info&}’ 

私は間違っていますか?

+2

それは「へ...のconst情報& 『情報*』から引数1のために知られていない変換」エラーメッセージにあります。 'ベクトル infoVector;は' info'型を受け入れますが、 'info *'型にしようとしています。 –

+2

なぜ新しいものを使用しますか? –

+0

ヤコブが指摘しているよりも少し悪いです。 'pushData'はポインターをとり、そのポインターのアドレスは関数の一時的なローカルポインタで、' push_back'に渡されます。これは与えられたエラーメッセージと一致しません。だから、これはデバッグ中の失火の結果だと思います。参考文献:[参照とポインタの使い分け](https://stackoverflow.com/questions/7058339/when-to-use-references-vs-pointers) – user4581301

答えて

1

info *タイプのアドレスをvector<info>::push_backonly accepts types of const info & or info &&)に渡そうとしているようです。あなたがpush_backを呼び出すときdereference operator * instead of the address-of operator &を使用してみてください:

this->infoVector.push_back(*data); 

しかしこれは、ポインタを使用するのに最適な方法ではない、とdataは、ベクターからか、削除された場合、削除された場合は、メモリリークやセグメンテーション違反につながる可能性があります。その後、削除

std::vector<info*> infoVector; 

class db { 
    private: 
    vector<info> infoVector; 
    public: 
    void pushData(info data) {   // note: not a pointer 
     this->infoVector.push_back(data); // note: not address-of 
    } 
}; 

int main(){ 
    info testData(123, "nice"); // note: not a pointer 
    db database; 
    database.pushData(testData); 
    return 0; 
} 

をそれ以外の場合は、あなたが本当にinfoVectorは、ポインタを含むようにしたい場合として、それを宣言し、:それはあなたの代わりにこれをやって検討するかもしれないので、そのメンバーを所有するvectorのためのより良いですアドレス - 演算子。

P.S.、avoid using namespace std whenever possible

+0

'this-> infoVector.push_back(* data);おそらくメモリリークを引き起こすでしょう。 – user4581301

+0

合意 - これを記録するためにコードと回答が更新されました。 – PaSTE

+0

両方のオプションが機能します!つまり、新しいオブジェクトをベクトルに追加することができます。今私は2番目の問題があります。私はベクトルからオブジェクトを印刷する方法を知らない。私はこれを試しました: 'void outPutData(){ cout << this-> infoVector.back(); } ' 私はこのような方法を使用しました:' database.outPutData() ' 私は動作しません。次のステップでは、 'info class'に関数' getId() 'を作成しました。そして、そのような修正 '出力データ()'メソッドで: 'coutの<< this -> infoVector [0] .getId();' 私はエラーを得た: function'非静的メンバの '無効な使用はどのような方法があります値を印刷するには? –

-1

あなたはvector<info>を持っていて、info *を置きたい、やってみてください:

int main(){ 
    info testData(123, "nice"); 

    db database; 
    database.pushData(testData);  

    return 0; 
} 
+1

これは正しい方向ですが、不完全です。 'pushData'も変更する必要があります。あなたはそれを示すべきです。 – user4581301

関連する問題