我正在解决一个问题,我有一些定制的“容器”DTO,其中包含一系列的项目。类的用户应该能够从容器中检索某个位置的项。我希望容器不保留指向它所包含的项的原始指针的引用,而是真正拥有它们,因此不需要自定义析构函数。这是我想出来的:
#include
class MyItem {
public:
MyItem(int n) : number(n){}
private:
int number;
};
class MyContainer {
public:
void addItem(MyItem item){
m_items.append(item);
}
MyItem* getItemAt(int pos){
if(pos < m_items.size() && pos >= 0){
return &(m_items.at(pos));
}
return nullptr;
}
private:
QList m_items;
};
int main(){
MyContainer container;
MyItem item1(4);
container.addItem(item1);
MyItem* item_ptr = container.getItemAt(0);
return 0;
}在返回时,
函数我得到这个错误:
main.cpp:21:24: error: cannot initialize return object of type 'MyItem *' with an rvalue of type 'const MyItem *'我的函数需要返回一个非常量值,因为调用者需要修改检索到的对象。有没有办法解决这个问题?这是避免析构函数并指示调用者返回值为空的最佳解决方案吗?
我知道有几种方法可以做到这一点:
返回一个可选项:不幸的是,我绑定到了C++11,所以不是一个选项
抛出一个异常:我真的不喜欢这个选项,因为代码库有0个异常atm,我不想在这里介绍它们。
发布于 2021-03-01 16:11:39
将指针返回到QList存储中的内存地址是不明智的。从QList文档“请注意,在QList上执行的任何非常量函数调用都将使所有现有迭代器处于未定义状态”。如果内部容器存储了实际的指针,那么这不是问题。这些甚至可以是智能指针,消除了编写析构函数的需要。
但是,我也看到您是通过值传递来添加项的。如果通过值传递是可以接受的,那么为什么不能返回呢?这是一个不一致的接口。
听起来你真的想通过引用来传递和返回。
和
..。
正如rafix所指出的,QList的
返回一个非常数引用,所以你可以简单地返回它。
那么你将如何做边界检查呢?有多种方法,但最简单的方法是只添加一个
方法。
https://stackoverflow.com/questions/66418054
复制相似问题