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

Posted

技术标签:

【中文标题】创建多个具有相同名称的类对象? C++【英文标题】:Creating multiple class objects with the same name? c++ 【发布时间】:2013-04-05 04:42:08 【问题描述】:

我正在制作一个查询 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 &lt;&lt; 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 循环中创建这些类对象并将其添加到我的地图中,每个对象都使用相同的名称,因为我当然不知道有多少结果正在返回并为每个对象声明一个类对象,但就目前而言,使用相同的名称只是每次都添加相同的对象,而不是实际替换值……至少我认为这是正在发生的事情??

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

【问题讨论】:

将本地堆栈变量car 的地址重复插入到您的地图中可能不会得到您想要的。我会从那里开始。 【参考方案1】:

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

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

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

【讨论】:

两个答案都一样正确,但你确实先回答了所以我不接受你的,谢谢大家【参考方案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 值。

【讨论】:

一般来说,不会将原始指针放入任何std 容器中,例如vectormap 等。这有什么意义?把你的实际物体放在那里。 @Joker_vD 运行时多态性。 shared_ptr 等是另一种选择,但并非总是必要的,并且它们中的基/派生转换有点棘手。 ohhh欢呼哈哈现在很容易修复所有工作(如果这就像一个真正的菜鸟错误我确定这是我是c ++的新手)欢呼帮助人们跨度>

以上是关于创建多个具有相同名称的类对象? C++的主要内容,如果未能解决你的问题,请参考以下文章

Python --类和实例

在 C++ 中的类中创建类对象的动态数组

C++的类和对象

如何创建具有从 csv 文件中的列表收集的唯一名称值的类的多个对象

CPP复习笔记 2

C++ 中的类属性变量