返回指针-C++的引用

返回指针-C++的引用,c++,pointers,reference,C++,Pointers,Reference,考虑下面的类 class mapping_items { public: mapping_items(){} void add(const mapping_item* item) { items_.push_back( item ); } size_t count() const{ return items_.size(); } const mapping_item& find(const std::

考虑下面的类

class mapping_items
{
public:

    mapping_items(){}

    void add(const mapping_item* item) {
        items_.push_back( item );
    }

    size_t count() const{
        return items_.size();
    }

    const mapping_item& find(const std::string& pattern){
        const mapping_item* item = // iterate vector and find item;
        return *item; 
    }

private:
    mapping_items(const mapping_items&); // not allowed
    mapping_items& operator=(const mapping_items&); // not allowed
    std::vector<const mapping_item*> items_;
};
C++常见问题解答说

尽可能使用引用,以及 当你必须的时候,给我指点

那么在上面的例子中,我应该返回常量映射项还是常量映射项*


我之所以选择mapping_item&是因为总是有一个默认的返回值可用。我永远不会有零回报。所以引用清楚地表明它不能有空值。这是正确的设计吗?

< P>这对我来说是一个合适的设计选择——就像C++ FAQ状态——当你可以使用引用时。IMO,指针的不必要使用似乎使代码更难理解。

< P>这对我来说似乎是一个合适的设计选择——就像C++ FAQ状态——在可能的时候使用引用。在我看来,不必要地使用指针似乎会使代码更难理解。

有人说,我同意

如果值可以为NULL,则使用指针 以及其他参考资料


对于您的示例,我可能会选择return const mapping_item;,因此,根据值,避免引用临时文件,并希望我的编译器优化复制。

有人说,我同意

如果值可以为NULL,则使用指针 以及其他参考资料


对于您的示例,我可能会选择return const mapping_item;,因此,根据值,避免引用临时文件,并希望我的编译器优化复制。

是的,这是正确的设计。客户端可以依赖非空值

另一方面,另一个类负责管理映射项的生存期

指针和所有权很容易导致内存泄漏或更糟的情况。你可能想考虑你是否真的需要存储指针,或者如果你可以复制拷贝MappIn项来避免内存泄漏。但是,如果需要管理子类映射项,则必须使用指针。如果实例较大或需要共享,则建议使用指针


如果您真的需要指针,请考虑使用Booo::SydDypPTR而不是原始指针,既在类内,也作为参数类型,例如添加函数。 是的,这是正确的设计。客户端可以依赖非空值

另一方面,另一个类负责管理映射项的生存期

指针和所有权很容易导致内存泄漏或更糟的情况。你可能想考虑你是否真的需要存储指针,或者如果你可以复制拷贝MappIn项来避免内存泄漏。但是,如果需要管理子类映射项,则必须使用指针。如果实例较大或需要共享,则建议使用指针


如果您真的需要指针,请考虑使用Booo::SydDypPTR而不是原始指针,既在类内,也作为参数类型,例如添加函数。 有一个问题-如果find函数失败,会发生什么情况?如果这种情况预计永远不会发生,那么您可以返回一个引用,并在发生时引发异常,尽管它不应该发生。如果另一方面可能发生,例如在地址簿中查找名称,则应该考虑返回指针,因为指针可以为空,指示查找失败。

< P>存在问题:如果您的查找函数失败,会发生什么?如果这种情况预计永远不会发生,那么您可以返回一个引用,并在发生时引发异常,尽管它不应该发生。如果另一方面可能发生,例如在地址簿中查找名称,则应该考虑返回指针,因为指针可以为null,指示查找失败。

此类将删除向量中的项。我没有在代码中显示析构函数。简单一点,谢谢你的编辑。我将更改代码以使用shared_ptr.BTW,该类不是公共API的一部分。这是内部使用的,我是唯一一个处理它的人。所以我知道在哪里分配和释放对象。我想知道是否值得使用shared\u ptr是这样的场景?这个类将删除向量中的项目。我没有在代码中显示析构函数。简单一点,谢谢你的编辑。我将更改代码以使用shared_ptr.BTW,该类不是公共API的一部分。这是内部使用的,我是唯一一个处理它的人。所以我知道在哪里分配和释放对象。我想知道是否值得使用shared_ptr是这样的场景?但是mapping_item有一个包含std::string的向量。因此,按值复制映射项的成本将很高。我通过提供私有复制构造函数和赋值运算符来阻止它,但mapping_项有一个包含std::string的向量。因此,按值复制映射项的成本将很高。我通过提供私有副本构造函数和赋值运算符来阻止它。find函数永远不会失败。如果找不到与模式匹配的项,则返回默认项。如何管理默认项?之前
总的来说,它在课堂上是静态的?如果是这样,那么返回一个引用就可以了。它只是指向默认映射项实例的另一个指针。但是谁创建了那个默认项呢?它是在主代码中初始化的,只初始化一次吗?当anon询问如何管理默认项时,您实际上根本没有回答anon的问题?例如,如果让find调用新的映射_项来生成默认对象,这就是内存泄漏。find函数永远不会失败。如果找不到与模式匹配的项,则返回默认项。如何管理默认项?大概它在类中是静态的?如果是这样,那么返回一个引用就可以了。它只是指向默认映射项实例的另一个指针。但是谁创建了那个默认项呢?它是在主代码中初始化的,只初始化一次吗?当anon询问如何管理默认项时,您实际上根本没有回答anon的问题?例如,如果让find调用新的mapping\u items来生成默认对象,那就是内存泄漏。谁控制mapping\u item对象的生存期?清理它是此类的责任。为了使代码易于发布,我省略了析构函数。谁拥有映射项对象的生命周期控制权?清理它是这些类的责任。我省略了析构函数,使代码更易于发布。