Задать вопрос
Pakonigoosy
@Pakonigoosy
Разработчик ПО

Почему размер объекта не совпадает?

У меня есть класс:
class object {
private:

public:
    vector<vector<double>> coords;
    vector<vector<int>> rels;
};

У этого класса есть подкласс:
class Terrain : public object {
private:

public:
    vector<vector<double>> coords = { {-viewportrl,viewportrl,0},{viewportrl,viewportrl,0},{-viewportrl,-viewportrl,0},{viewportrl,-viewportrl,0} };
    vector<vector<int>> rels = { {2,3},{1,4},{1,4},{2,3} };
};

В своем основном файле я объявляю вектор:
Terrain terr;
vector<object> wld = { terr };

Получается, что terr.coords.size()=4. НО wld[0].coords.size()=0.
Я так понимаю компилятор обращается к свойству coords класса object, но как мне сделать, чтобы он обращался именно к свойству coords класса Terrain. Если убрать из класса object свойство coords, то будет ругаться на то, что его нет
  • Вопрос задан
  • 118 просмотров
Подписаться 1 Простой 6 комментариев
Решения вопроса 2
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
1) Не следует допускать торчания из классов полей с данными - все поля, кроме, быть может, констант, следует делать приватными.
2) В таком случае, у ваших классов появятся методы для доступа к этим полям, которые нужно будет объявить виртуальными
3) Вместо хранения экземпляров в векторе объектов, следует сделать вектор из умных указателей на эти объекты
4) Базовый класс для этих объектов желательно сделать абстрактным, на худой конец - интерфейсным.

После этого, ваша гомологическая иерархия классов станет вести себя так, как вы этого хотите.
Ответ написан
Создавать объекты виртуальных классов следует только через:
std::vector<std::unique_ptr<object>> world;

auto terr = std::make_unique<Terrain>();
world.push_back(std::move(terr));

Или:
world.push_back(std::make_unique<Terrain>());

Чтобы устранить утечку памяти, которая сейчас присутствует в коде, нужно обязательно добавить в object:
object& operator=(object&&) = delete;
virtual ~object() = default;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы