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

标签 c++ qt object

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

我希望将此结果存储在 map 中(具有对应的对):

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

汽车对象由 8 个参数组成,其中一个是 car_id,所以首先我提取汽车 ID 并将其用作键,然后我想将整个汽车对象存储为 map 的值。 (我知道这让我将 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;

在此之后,我做了一个快速测试函数来遍历 map 并提取所有 ID( map 键)并检查它们是否不同(即函数有效)并且它们是。

但这只是一个检查,我需要的是能够从应该在 map 中的汽车对象上调用汽车的辅助功能。所以我使用相同的快速测试函数来遍历 map 和 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++;
    }
}

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

我的问题是...

有什么方法可以使用我目前的查询结构来创建这些类对象并将其添加到 while 循环中的映射中,每个对象都使用相同的名称,因为我当然不知道有多少结果正在返回并为每个对象声明一个类对象,但就目前而言,使用相同的名称只是每次都添加相同的名称,而不是实际替换值……至少我认为这是正在发生的事情??

任何建议或想法都将受到欢迎(抱歉,帖子太长了)

最佳答案

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

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

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

关于c++ - 创建具有相同名称的多个类对象? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15975004/

相关文章:

c++ - 从 Qt 源代码树中编译 Qt 工具

qt - 如何在Qt中将几个文件压缩为zip?

c++ - 如何可靠地杀死 Qt/C++ 中的线程?

ios - 将对象保存到Firebase

c++ - 哪种类型的多线程最适合学习?

c++ - 何时将整个 C++ 类框架放入 DLL 中?

php - Symfony 4 - 类的对象无法转换为字符串

java - DBUtils QueryRunner实例化

c++ - Visual C++ 2012 和 PCRE

c++ - 返回二维数组