C++ 简单的动态添加和使用对象
我不知道如何正确地做到这一点,例如,首先我创建了一个向量来存储对象C++ 简单的动态添加和使用对象,c++,vector,C++,Vector,我不知道如何正确地做到这一点,例如,首先我创建了一个向量来存储对象 vector<dog> mydogs; 它抱怨参数类型不匹配,所以我将向量更改为下面的代码,因为我想在向量上存储指针 vector<&dog> mydogs; 但是我现在无法访问迭代器,甚至想到这一点,我都有点迷茫。小崽子。你的第一次尝试很好。您希望存储一组狗,既不是引用也不是指针 vector<dog> mydogs; 或者,如果您有一只特定的狗,您也可以添加它: dog Lo
vector<dog> mydogs;
它抱怨参数类型不匹配,所以我将向量更改为下面的代码,因为我想在向量上存储指针
vector<&dog> mydogs;
但是我现在无法访问迭代器,甚至想到这一点,我都有点迷茫。小崽子。你的第一次尝试很好。您希望存储一组狗,既不是引用也不是指针
vector<dog> mydogs;
或者,如果您有一只特定的狗,您也可以添加它:
dog LordFleuroVanHautendeck;
mydogs.push_back(LordFleuroVanHautendeck);
甚至在一行中:
mydogs.push_back(dog()); // poor dog has no name
最后一行可能与原始行相似,但缺少的new
非常重要dog()
将是一只dog
,可用于vector::push_back()
,而新狗(即dog*
)不能使用。该语句
new dog()
返回指向新分配对象的指针(dog*
)。只用
vector<dog> mydogs;
如果您确实希望通过new
关键字动态创建dog实例,您可能需要使用
vector<dog*> mydogs;
mydogs.push_back(new dog());
指向狗的指针向量:
std::vector<dog *>
我建议您查看智能指针,因为向量
不会释放狗所占用的内存;它只是破坏了皮带 我明白了这一点,我遇到的问题是使用上面展示的迭代器访问它
使用迭代器访问:(*iterator)->bark()谢谢,这正是我想要的。但是为什么我必须使用圆括号+星型,为什么不使用差异操作符呢?迭代器是一个指针。取消对迭代器的引用引用向量中的一个项,它是指向狗的指针。因此,取消对迭代器的引用将生成一个指针。括号用于可读性和控制优先级。括号显示了里面的内容是指针,bark
方法与该项相关联。否则,您必须双重解除防护,然后访问成员,类似于**iter.bark()
。这就提出了“.”属于什么的问题。另一个选择是*iter->bark()
,它会问“这个->应用于什么?”
vector<dog> mydogs;
mydogs.push_back(dog());
vector<dog*> mydogs;
mydogs.push_back(new dog());
while(mydogs.size() > 0){
delete mydogs.back(); // delete the dog
mydogs.pop_back(); // get rid of the pointer
}
std::vector<dog *>
std::vector<dog *> animals;
//...
animals.push_back(new dog);