C++ 指针向量
如果我在类标题中有这样的定义:C++ 指针向量,c++,pointers,coding-style,reference,C++,Pointers,Coding Style,Reference,如果我在类标题中有这样的定义: vector<baddie*> baddies; 矢量坏人; 然后我在构造函数中初始化它,如下所示: Class::Class(vector<baddie*> input) { baddies = input; } baddies[0][i]; Class::Class(向量输入) { 坏人=输入; } 我的结局是什么?有两组指针指向对象的两个向量 直接指向原始向量会更好吗?这可能吗 或者在类中保存指针引用向量以避免重复指
vector<baddie*> baddies;
矢量坏人;
然后我在构造函数中初始化它,如下所示:
Class::Class(vector<baddie*> input)
{
baddies = input;
}
baddies[0][i];
Class::Class(向量输入)
{
坏人=输入;
}
我的结局是什么?有两组指针指向对象的两个向量
直接指向原始向量会更好吗?这可能吗
或者在类中保存指针引用向量以避免重复指针会更好吗?访问多个类中的对象和对象数组的最佳实践是什么?推荐人?指针?指针引用?提前谢谢你 如果您想共享数据,我可能会使用
std::vector
或boost::shared\u ptr
然而,这实际上取决于:
- 你的意图
- 如果需要共享数据
- 如果“坏蛋”真的那么昂贵的话
Class:Class(vector<baddie> input)
: baddies( input )
{}
Class:Class(矢量输入)
:坏人(输入)
{}
这取决于您想要提供的语义。在C++11中,您可能希望执行以下操作:
Class::Class( vector<baddie*> input ) : baddies( std::move(input) ) {}
Class::Class(向量输入):坏人(std::move(输入)){
这会将内存从参数中的副本移动到成员,而在C++03中,您可能会编写:
Class::Class( vector<baddie*> const & input ) : baddies( input ) {}
Class::Class(向量常量和输入):坏人(输入){}
这将使用副本初始化向量
请注意,此讨论仅涉及向量内容,而不涉及那些baddie
指针所指向的数据。也就是说,在这两种情况下,都会有两个向量,其指针指向相同的元素(即,内存中每个坏蛋
只有一个副本,两个指针指向它)
根据应用程序的语义,您可能希望从这种中间的浅层复制转到任意一端:执行深度复制(即在内存中创建新的baddie
元素,以便在构造函数完成后,原始和副本完全不相关)或根本避免处理,只需存储一个引用/指针,使两个向量完全相同(类内外的插入将在类内外可见)
另外,要注意指针向量,在向量被销毁之前,需要手动管理内存。这是一种不好的做法,因为它首先将向量复制到构造函数,然后将其复制到名为baddies的向量,在这种情况下,最好将输入作为引用,然后将其复制到baddies。如果你想控制拷贝,那么你可以考虑遍历输入向量并将每个值推到坏人向量。如果你想获得更快的速度,那么你可以把坏家伙向量和输入向量都声明为指针,然后把坏家伙指向输入向量的来源。这使得使用起来有点难看,因为如果使用[]对向量进行索引,那么将首先对指针进行索引,因此必须对其进行两次索引才能到达向量,如下所示:
Class::Class(vector<baddie*> input)
{
baddies = input;
}
baddies[0][i];
你所有问题的答案都取决于你使用向量的目的。•如果“坏家伙”真的那么昂贵,构造/复制-考虑到棱柱体人口过多,它们构造和复制成本很低:-)有没有一种方法可以简单地传递对原始向量的引用?这样你就有了一个对坏人向量的引用?@SirYakalot只需传递一个引用并存储该引用<代码>类::类(向量[const]&v):坏人(v){},成员
坏人
被声明为:向量[const]&baddies
(其中[const]
表示可选的const,也就是说,取决于Class
是否不需要修改向量,它应该是const)。正如答案中已经提到的,在这种情况下,在类
之外执行的更改将在类
内部可见。