首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt C++11从QList发出原始指针

Qt C++11从QList发出原始指针
EN

Stack Overflow用户
提问于 2021-03-01 15:23:19
回答 1查看 64关注 0票数 0

我正在解决一个问题,我有一些定制的“容器”DTO,其中包含一系列的项目。类的用户应该能够从容器中检索某个位置的项。我希望容器不保留指向它所包含的项的原始指针的引用,而是真正拥有它们,因此不需要自定义析构函数。这是我想出来的:

代码语言:javascript
运行
复制
#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;
}

在返回时,

函数我得到这个错误:

代码语言:javascript
运行
复制
main.cpp:21:24: error: cannot initialize return object of type 'MyItem *' with an rvalue of type 'const MyItem *'

我的函数需要返回一个非常量值,因为调用者需要修改检索到的对象。有没有办法解决这个问题?这是避免析构函数并指示调用者返回值为空的最佳解决方案吗?

我知道有几种方法可以做到这一点:

返回一个可选项:不幸的是,我绑定到了C++11,所以不是一个选项

抛出一个异常:我真的不喜欢这个选项,因为代码库有0个异常atm,我不想在这里介绍它们。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-01 16:11:39

将指针返回到QList存储中的内存地址是不明智的。从QList文档“请注意,在QList上执行的任何非常量函数调用都将使所有现有迭代器处于未定义状态”。如果内部容器存储了实际的指针,那么这不是问题。这些甚至可以是智能指针,消除了编写析构函数的需要。

但是,我也看到您是通过值传递来添加项的。如果通过值传递是可以接受的,那么为什么不能返回呢?这是一个不一致的接口。

听起来你真的想通过引用来传递和返回。

..。

正如rafix所指出的,QList的

返回一个非常数引用,所以你可以简单地返回它。

那么你将如何做边界检查呢?有多种方法,但最简单的方法是只添加一个

方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66418054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档