0

我正在制作一个查询 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(地图键)并检查它们是否不同(即函数有效)并且它们是。

但这只是一个检查,我需要的是能够从 car 调用应该在地图中的汽车对象的附件功能。所以我使用相同的快速测试函数来迭代地图和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循环中创建这些类对象并将其添加到我的地图中,每个对象都使用相同的名称,因为我当然不知道返回了多少结果并为每个对象声明一个类对象,但是就目前而言,使用相同的名称只是每次都添加相同的名称,而不是实际替换值……至少我认为这是正在发生的事情?

欢迎任何建议或想法(对不起,很长的帖子)

4

2 回答 2

2

您遇到未定义的行为。原因是您在映射中插入了一个指向局部变量的指针。

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

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

于 2013-04-12T15:18:38.197 回答
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不再需要时,您需要遍历delete它的Car值。

于 2013-04-12T15:19:11.333 回答