2013-04-12 120 views
0

我正在查询一个查询MySQL数据库的应用程序。创建多个具有相同名称的类对象? C++

我想这样做的结果将被存储在一个图(其具有相应的一对):

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

的汽车对象是由8个参数,其中之一是car_id所以,首先我拉汽车ID并将其用作钥匙,然后我想将整个汽车对象存储为地图的值。 (我知道这是包装我要存储car_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; 

这个我做了一个快速测试功能遍历在地图上,并把所有的ID的(图键),并检查它们是不同的后(即函数工作)他们是。

但这只是一个检查,我需要的是能够从汽车上调用应该在地图上的汽车对象的附件功能。所以,我用同样的快速测试功能遍历地图和cout << car.toString();(一个简单的字符串函数在汽车类)结束:

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++; 
    } 
} 

这表明结果的正确数量不过他们都是即车相同已添加到地图中的每个条目的对象是同一

我的问题是(对,是由该查询找到的最后一个记录的值)...

有什么办法,使用这个结构我目前已经为我的查询创建并添加了这些类obj在while循环中使用相同的名字来映射到我的映射,因为当然我不知道有多少结果被返回并为每个对象声明一个类对象,但是因为它使用相同的名称,所以只需添加每次都是一样的,实际上并没有取代这些值......至少那是我认为正在发生的事情?

任何意见或想法将

+0

将一个本地堆栈变量'car'的地址重复插入到您的地图中可能不会达到您想要的。我会从那里开始。 – WhozCraig

回答

2

遇到未定义行为欢迎(遗憾的长期职位)。原因是你在地图中插入了一个指向局部变量的指针。

getAll的循环中,当循环重新开始下一项时,car变量不再有效。

我建议你看看指针std::shared_ptr

+0

干杯家伙现在都在工作 – AngryDuck

+0

这两个答案同样正确,但你确实回答了第一个如此糟糕的接受你,尽管如此,多亏了 – AngryDuck

2

这是您的problem--

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* car = new Car(...); 

,然后当不再需要m_car,则需要遍历和deleteCar值。

+0

通常,不会将原始指针放入任何'std'容器,例如'vector','map'等等。有什么意义?把你的实际对象放在那里。 –

+0

@Joker_vD运行时多态性。 'shared_ptr'等是另一种选择,但并非总是必要的,基本/派生的转换在它们中有点棘手。 –

+1

ohhh欢呼哈哈很容易修复现在所有的工作(以及如果真的这样的菜鸟错误*这肯定它是*新的C++)欢呼帮助人们 – AngryDuck

相关问题