2013-04-12 3 views
0

MySQL 데이터베이스를 쿼리하는 응용 프로그램을 만들고 있습니다.같은 이름의 여러 클래스 객체 만들기? C++

std::map<int, Car*> m_car; 
typedef std::pair<int, Car*> m_car_pair; 

차 개체 그래서 우선 I 당겨 car_id 중 하나는 8 개 개의 파라미터로 구성된다

는 이런 결과는 (대응하는 쌍을 갖는) 맵에 저장할 자동차 ID를 키로 사용하면 전체 자동차 객체를지도의 값으로 저장하려고합니다. (나는 이것이 car_id를 두 번 저장하는 나를 감추고 있다는 것을 알고 있지만, 그 순간 나는 그것을 신경 쓰지 않는다.)

어쨌든 여기 내 쿼리 코드입니다 : 내가지도를 반복 당겨 ID의 (지도 키)을 모두 그들은 달랐다 확인하기 위해 간단한 테스트 기능을 만든이 후

void DatabaseController::getAll(QString query_string) 
{ 
    // Console log message 
    std::cout << "Querying Database" << std::endl; 

    /// Declare SQL query and pass function parameter 'query' 
    QSqlQuery query(query_string); 

    // execute the query 
    query.exec(); 

    int count = 0; 

    // While results are coming in 
    while(query.next()) 
    { 
     // Call car constructor passing all parameters 
     Car car(query.value(count).toInt(), query.value(count+1).toString(), query.value(count+2).toString(), query.value(count+3).toString(), 
      query.value(count+4).toInt(), query.value(count+5).toInt(), query.value(count+6).toInt(), query.value(count+7).toString()); 

     if (car.getcarID() != 0) 
     { 
      m_car_records.insert(m_car_pair(car.getcarID(), &car)); 
     } 
    } 

    std::cout << "Database query finished" << std::endl; 

(즉, 함수는 일) 그리고 그들은 있었다.

하지만 그것은지도에 있어야하는 자동차 객체의 자동차에서 액세서리 기능을 호출 할 수 있어야한다는 것입니다.

void DatabaseController::test() 
{ 
    m_car_records_iterator = m_car_records.begin(); 

    for(unsigned int i = 0; i < m_car_records.size(); i++) 
    { 
     car *test = m_car_records_iterator->second; 
     std::cout << test->toString() << std::endl; 
     m_car_records_iterator++; 
    } 
} 

이 결과의 정확한 수는 있지만 그들은 모두 차 즉, 동일 보여 주었다 : 그래서지도와 cout << car.toString(); (자동차 클래스에서 문자열 함수에 대한 간단한)을 반복 같은 간단한 테스트 기능을 사용 지도의 모든 항목에 추가 된 객체는

사용하는 어떤 방법이 있나요 ...

내 질문은 같은 (쿼리에 의해 마지막으로 발견 된 레코드의 값)입니다 이 구조체는 현재 내 질의에 대해이 클래스 obj를 만들고 추가 할 수 있습니다. 물론 각 인스턴스에 대한 동일한 이름을 사용하여 while 루프 내지도에 ects, 나는 얼마나 많은 결과가 반환되는지 알 수없고 각 객체에 대해 클래스 객체를 선언하지만 동일한 이름을 사용하는 것은 단지 같은 때마다 값을 실제로 바꾸지 않을 때마다 ... 적어도 그것이 내가 생각하는 것입니다. 당신은 정의되지 않은 동작가 발생하는

+0

로컬 스택 변수 'car'의 주소를 맵에 반복해서 삽입하면 원하는 것을 얻지 못할 것입니다. 나는 거기에서 시작할 것입니다. – WhozCraig

답변

2

어떤 조언이나 아이디어 (긴 게시물에 대한 죄송) 환영 될 것이다. 그 이유는지도에 지역 변수에 대한 포인터를 삽입하기 때문입니다.

getAll의 루프에서 다음 항목에서 루프가 시작될 때 car 변수가 더 이상 유효하지 않습니다.

포인터에 대해서는 std::shared_ptr을 살펴 보시기 바랍니다.

+0

건배 모두 정상적으로 작동했습니다 – AngryDuck

+0

두 답이 모두 똑같이 맞지만 처음에는 답을 얻었으므로 모두에게 감사했습니다. – AngryDuck

2

이 당신의 problem-- 루프 반복에서, Car 인스턴스가 파괴

Car car(...); // ***Stack allocated 

if (car.getcarID() != 0) 
{ 
    m_car_records.insert(m_car_pair(car.getcarID(), &car)); 
} 
    //But the pointer is what's stored 

하고 포인터가 정의되지 않은 동작의 결과로, 매 단다. 당신은

Car* car = new Car(...); 

m_car가 더 이상 필요하지 않은 경우 다음, 당신은을 통해 반복 할 필요가 없습니다 및 deleteCar 값이 필요합니다.

+0

일반적으로 원시 포인터를 '벡터', '지도' , 등등. 요점은 무엇입니까? 거기에 실제 물건을 넣어 라. –

+0

@ Joker_vD 런타임 다형성. 'shared_ptr' 등은 또 다른 옵션이지만 반드시 필요한 것은 아니며 기본/파생 된 변환은 그 안에 약간 더 까다 롭습니다. –

+1

ohhh 건배 하하 꽤 쉽게 모든 일을 고칠 수 있습니다. (그리고 진짜 신참 실수 *가 확실합니다. – AngryDuck

관련 문제