如果我有课:
Class aClass
{
vector<aClass> connections;
}
如果我要做的话,其他一切都被正确宣布:
aClass a = new aClass();
aClass b = new aClass();
b.connections.push_back(a);
这会创建对a
的引用,还是会复制该类。
我希望它是一个指向该类的指针,但我不确定是否需要额外的语法来确保这一点。我记得读过,当一个类声明为aClass a = new aClass
时,它正在创建一个指向堆中对象的指针,但我不确定这里会发生什么。
作为参考,这适用于链接列表。
如果有人能想到这个问题的更好的标题,请继续编辑。
答案 0 :(得分:2)
connections
应为vector<aClass*>
,aClass a
应为aClass* a
。
然后,对于b.connections.push_back(a);
,将复制指针的值,而不是指针对象(即指向的对象)。
我建议您使用smart pointers而不是原始指针,如果您想使用指针,例如std::vector<std::shared_ptr<aClass>>
。
答案 1 :(得分:0)
首先,vector<aClass>
不是类的向量,它是类的实例向量。
其次,在C ++中编译很难aClass a = new aClass();
。在大多数情况下,类的默认构造实例仅创建为aClass a;
,而new aClass()
通常会将指针返回给类的新实例。
第三,即使您push_back
向量的实例,它也会被复制。
对于默认构造的对象,可以通过resize
向量{1}在向量的末尾构造一个新对象。
自2011年起,您可以使用emplace_back
直接在向量内部通过非默认构造函数(使用非空构造参数集)构造实例。
答案 2 :(得分:0)
如果代码是可编译的,那么我认为你的意图是:
documentation表示有2次重载
void push_back( const T& value );
void push_back( T&& value );
因此,只要您不明确std::move
或从函数中输入强制转换或push_back
返回值,就会触发第一个重载,这意味着复制push_back
将会叫做。否则第二个,移动将被调用。
编辑:类型广告和std::move
是同样的事情。但是,它保留了const的正确性,因此如果你要传递const T
,那么std :: move将使它成为const T&&
,这在重载决策中非常危险。
你永远不应该通过const T&&
,为什么阅读here。
答案 3 :(得分:0)
aClass a = new aClass();
aClass b = new aClass();
b.connections.push_back(a);
它甚至不会编译。有人提到你应该写aClass *a
和aClass *b
。
aClass a;
aClass b;
b.connections.push_back(a);
这会将值复制到向量,因为向量包含aClass对象(值,而不是地址)。它不会复制任何地址。但是,如果你做了这样的事情:
vector<aClass*> connections;
aClass *a = new aClass();
aClass *b = new aClass();
b.connections.push_back(a);
然后向量将保存指向aClass对象(aClass的实例)的指针。所以在这种情况下,connections [0]将指向a
对象。如果你这样做::
cout << connections[0]<< endl;
cout << a << endl;
然后这些线是相等的。他们将打印相同的东西(相同的地址)。
最后,如果删除a
对象:
delete a;
然后它将指向内存中放置对象的位置,但不再有a
个对象。所以你做不到:
cout << a << endl;
但你仍然可以这样做:
cout << connections[0] << endl;
它将打印与以前相同的地址。