我对对象引用有些困惑。请检查以下示例:
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;
}
基本上我想要的就是创建一个向量并将其传递给ListHandler。除了ListHandler本身之外,不会在其他任何地方使用此向量,因此我希望ListHandler可以进行所有其他操作和清理等工作。
最佳答案
这取决于您是否要共享底图矢量。总的来说,我认为最好避免尽可能地共享,因为它消除了对象所有权的问题。不共享:
ListHandler类
{
上市:
ListHandler(const std :: vector &list):_list(list){}
〜ListHandler(){}
私人的:
std :: vector _list;
};
请注意,与您的示例不同,我将其命名为const
,因为原始文件将不会被修改。但是,如果我们希望坚持并共享相同的基础对象,则可以使用如下所示的内容:
ListHandler类
{
上市:
ListHandler(std :: vector &list):_list(&list){}
〜ListHandler(){}
私人的:
std :: vector * _list;
};
请注意,在这种情况下,我选择让调用者保留为对象的所有者(因此,确保列表在处理列表对象的整个生命周期中都存在,并且稍后将其释放,这是调用者的责任。您接管所有权的示例也是有可能的:
ListHandler类
{
上市:
ListHandler(std :: vector * list):_list(list){}
ListHandler(const ListHandler&o):_ list(新std :: vector (o._list)){}
〜ListHandler(){删除_list; _list = 0; }
ListHandler&swap(ListHandler&o){std :: swap(_list,o._list);返回* this; }
ListHandler&operator =(const ListHandler&o){ListHandler cpy(o);返回swap(cpy); }
私人的:
std :: vector * _list;
};
尽管上述当然是可能的,但我个人不喜欢它……对于不只是智能指针类的对象获取指向另一个对象的指针的所有权,我感到困惑。如果这样做的话,可以通过将std :: vector包装在智能指针容器中来使其更加明确,如下所示:
ListHandler类
{
上市:
ListHandler(const boost :: shared_ptr &list):_list(list){}
〜ListHandler(){}
私人的:
boost :: shared_ptr _list;
};
我发现以上在传达所有权方面更加清晰。但是,所有这些通过列表传递的不同方式都是可以接受的……只要确保用户知道谁将拥有什么。