![](/img/trans.png)
[英]C++, Member function returning const reference to vector containing pointers to const objects
[英]How to assign value to const vector of pointers of objects in c++?
我目前正在尝试将值分配给 const std::vector。 年龄是 class 源自 class 动物。
#include <iostream>
#include <vector>
class Animal{
public:
Animal(std::string name) : name_(name) {}
std::string getName() {return name_;}
protected:
std::string name_;
};
class Age : public Animal
{
public:
Age(std::string name, int age) : Animal(name), age_(age) {}
private:
int age_;
};
class AllAnimals
{
public:
AllAnimals(){};
void setVector(const std::vector<Age*> v) {all_animals_ = v;}
private:
const std::vector<Age*> all_animals_;
};
int main()
{
AllAnimals animals();
std::vector<Age*> all_animals;
all_animals.push_back(new Age("Cat", 3));
all_animals.push_back(new Age("Dog", 4));
all_animals.push_back(new Age("Mouse", 2));
all_animals.push_back(new Age("Duck", 1));
return 0;
}
编译代码后,我收到错误消息:
error: passing ‘const std::vector<Age*>’ as ‘this’ argument discards qualifiers [-fpermissive] void setVector(const std::vector<Age*> v) {all_animals_ = v;}
我的实现有什么问题,如何为 all_animals_ 分配值?
初始化后不能分配给向量,它是const
。 解决方案是初始化它。 由于您的代码正在处理原始拥有的指针,并且需要一些关于正确使用它们或使用智能指针的提醒,但这不是问题的主题,我让自己简单地举了很多例子:
#include <vector>
struct foo {
const std::vector<int> x;
foo(const std::vector<int>& a) : x(a) {}
};
int main() {
std::vector<int> v{1,2,3,4};
foo f(v);
}
成员在构造函数的主体执行之前被初始化,因此初始化它的地方是构造函数成员初始化列表。
请注意,使成员const
很少是一个好主意。 例如,当实例具有const
成员时,您不能复制它们。 如果您希望成员在构造后不被修改,这是封装真正得到回报的情况。 将成员设为私有,并且不提供来自外部的任何写访问权限。 然后从外部成员是不可修改的,但您仍然可以复制 class 的实例。
PS:这里的错误信息可能有点混乱。 它指的是std::vector
的=
,因此消息中的this
是向量,而不是您的AllAnimals
实例。 当成员 function 存在 const 正确性问题时,“将 XY 作为 'this' 参数传递会丢弃限定符”是典型的错误消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.