创建具有相同名称的多个类对象? C ++

时间:2013-04-12 15:14:24

标签: c++ qt object

我正在创建一个查询MySQL数据库的应用程序。

我希望将结果存储在地图中(具有相应的对):

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

这显示了正确的结果数,但它们都是相同的,即已添加到地图中每个条目的汽车对象是相同的(查询找到的最后一条记录的值)

我的问题是......

有没有办法使用我目前用于我的查询的这个结构我可以在while循环中使用相同的名称创建并将这些类对象添加到我的地图中,因为当然我不知道有多少结果正在被返回并为每一个声明一个类对象,但因为它使用相同的名称只是每次都没有实际替换值时添加相同的...至少这是我认为发生的事情?

任何建议或想法都会受到欢迎(对于长篇文章感到抱歉)

2 个答案:

答案 0 :(得分:2)

您遇到未定义的行为。原因是您在地图中插入指向局部变量的指针。

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

我建议您查看std::shared_ptr指针。

答案 1 :(得分:2)

这是你的问题 -

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值。