创建多个具有相同名称的类对象? 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 << 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
容器中,例如vector
、map
等。这有什么意义?把你的实际物体放在那里。
@Joker_vD 运行时多态性。 shared_ptr
等是另一种选择,但并非总是必要的,并且它们中的基/派生转换有点棘手。
ohhh欢呼哈哈现在很容易修复所有工作(如果这就像一个真正的菜鸟错误我确定这是我是c ++的新手)欢呼帮助人们跨度>
以上是关于创建多个具有相同名称的类对象? C++的主要内容,如果未能解决你的问题,请参考以下文章