gpt4 book ai didi

c++ - 类、构造函数和指针类成员

转载 作者:行者123 更新时间:2023-11-27 23:33:54 25 4
gpt4 key购买 nike

我对对象引用有点困惑。请检查以下示例:

class ListHandler {
public:
ListHandler(vector<int> &list);
private:
vector<int> list;
}

ListHandler::ListHandler(vector<int> &list) {
this->list = list;
}

因为内部

vector<int> list;

定义,在这里我会浪费内存吗?所以正确的应该是:

class ListHandler {
public:
ListHandler(vector<int>* list);
private:
vector<int>* list;
}

ListHandler::ListHandler(vector<int>* list) {
this->list = list;
}

ListHandler::~ListHandler() {
delete list;
}

基本上我想要的只是创建一个 vector 并传递给 ListHandler。除了 ListHandler 本身之外,这个 vector 不会在其他任何地方使用,所以我期望 ListHandler 做所有其他事情和清理等等。

最佳答案

这取决于您是否要共享底层 vector 。总的来说,我认为尽可能避免共享是一个好习惯,因为它消除了对象所有权的问题。不分享:

class ListHandler {    public:        ListHandler(const std::vector<int>& list) : _list(list) {}        ~ListHandler(){}    private:        std::vector<int> _list;};

请注意,与您的示例不同,我将其设为 const,因为不会修改原始内容。但是,如果我们想保留并共享同一个底层对象,那么我们可以使用这样的东西:

class ListHandler {    public:        ListHandler(std::vector<int>& list) : _list(&list) {}        ~ListHandler(){}    private:        std::vector<int>* _list;};

请注意,在这种情况下,我选择将调用者保留为对象的所有者(因此调用者有责任确保列表在列表处理程序对象的生命周期内存在,并且稍后会释放列表).您的示例也有可能接管所有权:

class ListHandler {    public:        ListHandler(std::vector<int>* list) : _list(list) {}        ListHandler(const ListHandler& o) : _list(new std::vector<int>(o._list)) {}        ~ListHandler(){ delete _list; _list=0; }        ListHandler& swap(ListHandler& o){ std::swap(_list,o._list); return *this; }        ListHandler& operator=(const ListHandler& o){ ListHandler cpy(o); return swap(cpy); }    private:        std::vector<int>* _list;};

虽然上述当然是可能的,但我个人不喜欢它......我发现对于一个不仅仅是智能指针类的对象来说,获取指向另一个对象的指针的所有权会让人感到困惑。如果我这样做,我会通过将 std::vector 包装在智能指针容器中来使其更加明确,如下所示:

class ListHandler {    public:        ListHandler(const boost::shared_ptr< std::vector<int> >& list) : _list(list) {}        ~ListHandler(){}    private:        boost::shared_ptr< std::vector<int> > _list;};

我发现以上内容在传达所有权方面更加清晰。然而,所有这些传递列表的不同方式都是可以接受的……只要确保用户知道谁将拥有什么。

关于c++ - 类、构造函数和指针类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2565068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com