【发布时间】:2021-05-30 17:41:23
【问题描述】:
我正在解决一个问题,我有某种定制的“容器”DTO,其中包含一系列项目。该类的用户应该能够从容器中的某个位置检索项目。我希望容器不保留对其包含的项目的原始指针的引用,而是真正拥有它们,因此不需要自定义析构函数。这是我想出的:
#include <QList>
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<MyItem> m_items;
};
int main(){
MyContainer container;
MyItem item1(4);
container.addItem(item1);
MyItem* item_ptr = container.getItemAt(0);
return 0;
}
在getItemAt 函数的返回中,我收到了这个错误:
main.cpp:21:24: error: cannot initialize return object of type 'MyItem *' with an rvalue of type 'const MyItem *'
我的函数需要返回一个非 const 值,因为调用者需要修改检索到的对象。有没有办法来解决这个问题?这是避免析构函数并向调用者指示返回值为空的最佳解决方案吗?
我知道有几种方法可以做到这一点:
- 返回一个可选的:不幸的是我绑定到 C++11 所以不是一个选项
- 抛出异常:我真的不喜欢这个选项,因为代码库有 0 个异常 atm,我宁愿在这里不介绍它们。
【问题讨论】:
-
at(idx)返回const T&。operator[](idx)返回T&,使用后者即可。 -
还是出现上述错误。
-
“还是出现上面提到的错误”这不可能是真的。
-
使用标准容器。不再有任何理由在不与现有 Qt API 接口的新代码中使用 QList。