Как присвоить значение константному вектору указателей объектов в c ++? - PullRequest
0 голосов
/ 16 апреля 2020

В настоящее время я пытаюсь присвоить значение const std :: vector. Возраст - это класс, производный от класса Animal.

#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;}

В чем проблема с моей реализацией и как я могу присвоить значение для всех животных _?

1 Ответ

2 голосов
/ 16 апреля 2020

Вы не можете назначить вектор после того, как он был инициализирован, это const. Решение состоит в том, чтобы инициализировать это. Поскольку ваш код имеет дело с необработанными указателями и требует некоторых напоминаний о правильном их использовании или использовании вместо этого умных указателей, но это не топика c вопроса, я позволил себе просто привести пример: 1002 *

#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. Если вы хотите, чтобы член не изменялся после создания, это ситуация, когда инкапсуляция действительно окупается. Сделайте члена приватным и не предоставляйте доступ для записи извне. Тогда извне член не подлежит изменению, но вы все равно можете копировать экземпляры класса.

PS: сообщение об ошибке может быть немного запутанным здесь. Это относится к = из std::vector, поэтому this в сообщении - это вектор, а не ваш AllAnimals экземпляр. «Передача XY в качестве аргумента« this »отбрасывает квалификаторы» - это типичное сообщение об ошибке, которое вы получаете, когда возникает проблема с константной корректностью функции-члена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...