2014-10-08 2 views
0

행운을 지닌 벡터에 저장된 객체의 getter 메소드에 액세스하려고합니다. 컴파일 할 때 오류는 없지만 getter에 액세스하려고하면 프로그램이 중단됩니다.벡터에서 객체의 getter에 액세스하지 못했습니다.

내 개체는 Item이라는 클래스이며 Item에 대한 포인터로 벡터를 초기화합니다. 나는 그것이 벡터에서가 아닌 외부 때 그것은 단지 일이 std::cout << bag[0]->getID() << std::endl;

처럼 게터에 액세스하려고 할 때

vector<Item*> bag = vector<Item*>(someSize);

프로그램

이 실패합니다. (. bag 빈 벡터로 밖으로 시작합니다) :

+1

'bag'은 0으로 초기화 된 someSize 요소를 포함합니다. 즉 유효하지 않은 포인터입니다. –

+1

개체가 아닌 포인터를 저장해야하는 이유가 있습니까? 객체를 저장하면 훨씬 간단 해집니다. 왜냐하면 벡터가 생성하고 파괴하기 때문입니다. –

+0

동일한 유형의 객체를 다시 초기화하지 않으니까 Mike – Hayden

답변

1

이 코드는 작동

#include <iostream> 
#include <vector> 


class Item { 
    int ID; 
public: 
    int getID() const {return ID;} 
    void setID(int myid){ID = myid;} 
}; 

int main(){ 

    Item *i1 = new Item; 
    i1->setID(5); 
    std::vector<Item*> bag; 
//std::vector<Item*> bag(20); 
    bag.push_back(i1); 
    std::cout << bag[0]->getID() << std::endl; 
    delete i1; 
    return 0; 
} 

을하지만 주석 아래에있는 라인 벡터 정의를 교체 할 경우 push_back이 벡터의 에 추가되기 때문에 코드가 깨집니다. push_back 연산을 수행 한 후 크기가 20 인 벡터는 21 개의 요소로 끝나고 push_back을 통해 추가 된 요소는 시작 부분이 아니라 벡터의 끝에 있습니다.

+0

getID는 const 함수가 될 수 있습니다. –

+0

로컬 변수의 주소를 뒤로 밀면 위험합니다. 벡터가 더 큰 범위에 복사되거나 존재하면 UB를 얻습니다. –

+0

이제 포인터를 삭제해야합니다. –

0

실제로 어딘가에 개체를 만들어야합니다. Item()은 간단 경우에, 당신은 같은 것을 할 수 있습니다

for(auto& item : bag) 
{ 
    item = new Item(); 
} 

은 그럼 당신은 멤버 함수를 호출 할 수 있습니다.

관련 문제