2013-01-02 5 views
0

문제는 기본 클래스와 3 개의 자식 클래스가 있고 모든 3 개의 하위 클래스를 대표하는 모든 요소를 ​​배치 할 수있는 벡터를 만들고 싶습니다. 여기서이, 그것은 컴파일하고 그것뿐만 아니라 실행까지 작동하는 파일C++에서 파일의 벡터로 벡터를 읽는 중

vector<Robot*> robots; 
vector<Mac> mac; 
vector<Eco> eco; 
vector<Pro> pro; 
vector<int> charge; 
vector<int> deliver; 

try { 
    string s; 
    ifstream f; 

    do { 
     cout << "Add meg a filenevet" << endl; 
     cin >> s; 
     f.open(s.c_str()); 
    } while (!f.good()); 

    cout << "adatok beolvasasa..." << endl; 

    int napok; 
    if (!(f >> napok)) throw 1; 
    charge.resize(napok); 
    deliver.resize(napok); 

    for (int i = 0; i<napok; i++) { 
     if (!(f>>charge[i])) throw 1; 
     if (!(f>>deliver[i])) throw 1; 
    } 

    string type, name; 
    int battery; 
    int m = 0; int e = 0; int p = 0; 
    std::string line; 
    while (std::getline(f, line)) { 
     stringstream ss(line); 
     if (ss >> type && ss >> name && ss >> battery) { 

      if (type=="Mac") { 
       cout << "mac" << endl; 
       Mac r = Mac(name,battery); 
       mac.push_back(r); 
       robots.push_back(&mac[m]); 
       m++; 
      }; 
      if (type=="Eco") { 
       cout << "eco" << endl; 
       Eco r = Eco(name,battery); 
       eco.push_back(r); 
       robots.push_back(&eco[e]); 
       e++; 
      } 
      if (type=="Pro") { 
       cout << "pro" << endl; 
       Pro r = Pro(name,battery); 
       pro.push_back(r); 
       robots.push_back(&pro[p]); 
       p++; 
      }; 
     } 
    } 

에서 읽고 처리하는 코드의 일부입니다,하지만 난 함수의 예를 robots[i].getBattery(); 프로그램 동결에 액세스하려고 할 때. 이 포인터 그냥 아무데도로 가리키는 것 같지만 :(

+0

'robots [i] .getBattery();'를 (를) 호출하는 곳은 어디입니까? 'mac','eco' 및'pro'가 파괴되면 그들의 멤버도 파괴됩니다. 이것은'로봇 '이 잘못된 객체에 대한 포인터를 가지고 있음을 의미합니다. – Oswald

+0

그들은 파괴되지 않습니다 :/ive이 모든 주 기능에 쓰기 (그것은 조금 더 쉽게 만들 것이기를 바래요) 그리고 나는 주 기능에서도 이것을 부릅니다. – Andesz

답변

1

문제는 당신이 둘 사이에 어떤 동기화없이 개체에 액세스의 두 가지의 독립적 인 방법을 가지고 있다는 것입니다 왜 내가 아무 생각이 없습니다.

당신이를 누르면 항목을 벡터에 넣은 다음 포인터를 가져 가면 벡터의 저장소가 이동되거나 무효화되지 않는 경우에만 포인터가 유효합니다. 반복되는 push_back() 호출은 벡터 재 할당을 트리거 할 수 있으며 보장되지 않습니다 이것이 일어날 수 있으므로 요소가 새로운 메모리 위치로 이동 될 수 있지만 포인터가 업데이트되지 않는다는 것을 의미합니다. 따라서 포인터가 어디에도 없습니다.

데이터를 보관할 컨테이너 한 세트와 상기 데이터에 대한 포인터를 보유하고있는 다른 컨테이너가 꽤 나쁜 디자인처럼 보입니다. 보시다시피, 코드를 개선하고 발생한 문제를 해결할 수있는 두 가지 옵션이 있습니다. 두 경우 모두 하나의 컨테이너가 다형 요소에 대한 포인터를 보유하기 만하면 컨테이너를 선언하는 것입니다.

1) boost::ptr_vector을 사용하여 다형성 객체에 대한 포인터를 저장하십시오. 이 컨테이너는 포인터 (예 : std::vector이 아니며 후자는 값 의미론을 가짐)를 보유하도록 설계되었으며 여기에 포함 된 개체의 수명 관리를 담당합니다.

2) 부스트를 사용할 수없는 경우 std::vector<std::shared_ptr<Robot> >을 사용하여 다형성 객체에 대한 포인터를 보유합니다.

두 경우 모두 값으로 항목을 포함하는 컨테이너를 제거하고 힙에 개체를 할당 한 다음 포인터를 컨테이너에 넣습니다.

관련 문제