2017-11-06 1 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 클래스의 객체를 생성하고있다. 객체에는 intstring 변수가 있습니다. 그런 다음 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 알려진 변환"오류 메시지에 있습니다. 'vector infoVector;를 가지고 있는데'info' 타입을 받아들이지 만'info *'타입을 주려고합니다. –

+2

왜 새로 사용하십니까? –

+0

제임스가 지적한 것보다 약간 나쁩니다. 'pushData'는 포인터를 취하고 포인터의 주소는 함수의 임시 포인터이며'push_back'으로 전달됩니다. 이것은 주어진 오류 메시지와 일치하지 않으므로 디버깅하는 동안 약간의 실연의 결과라고 생각합니다. 유용한 참고 사항 : [참고 vs. 포인터 사용시기] (https://stackoverflow.com/questions/7058339/when-to-use-references-vs-pointers) – user4581301

답변

1

info * 유형의 주소를 vector<info>::push_back (예 : only accepts types of const info & or info &&)으로 전달하려는 것 같습니다.

this->infoVector.push_back(*data); 

이 있지만, 포인터를 사용하는 좋은 방법이 아니며, data이 벡터에서 제거 된 경우 또는이 삭제 된 경우 메모리 누출 또는 세그먼테이션 폴트 (segfault)로 이어질 수 : 당신이 push_back를 호출 할 때 dereference operator * instead of the address-of operator &를 사용해보십시오. 회원을 소유하기 위해 vector 더 나은, 그래서 대신이 일을 고려해 볼 수 있습니다 :

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를 원하는 경우 :

std::vector<info*> infoVector; 

하는 것은 다음 제거 address-to 연산자.

P.S., avoid using namespace std whenever possible!

+0

'this-> infoVector.push_back (* data); '라고하면 메모리 누출이 발생할 수 있습니다. – user4581301

+0

동의 - 코드와 응답이 업데이트되었습니다. – PaSTE

+0

두 옵션이 모두 작동합니다. 나는 새로운 객체를 벡터에 추가 할 수 있다는 것을 의미한다. 이제 두 번째 문제가 생겼습니다. 벡터에서 개체를 인쇄하는 방법을 모르겠습니다. 나는 이것을 시도했다 : 'void outPutData() { cout << this-> infoVector.back(); }' 그럼이 방법을 사용했습니다 :'database.outPutData()' 나는 작동하지 않습니다. 다음 단계에서는'info class'에'getId()'함수를 만들었습니다. 비 정적 부재 function' 의 '잘못된 사용하는 방법이있다 :; 변형에이어서'outPutData()는'그런 방법 I가있어 오류 '가 은'<< this -> infoVector [0] .getId을()를 법원 값을 출력 하시겠습니까? –

-1

당신은 vector<info>이 있고 info *을 데려 가고 싶다는, 수행하려고 :

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

    db database; 
    database.pushData(testData);  

    return 0; 
} 
+1

이것은 올바른 방향이지만 불완전합니다. 'pushData'도 수정해야합니다. 당신도 그것을 보여 주어야합니다. – user4581301

관련 문제