наследование векторов и инициализация - PullRequest
1 голос
/ 23 декабря 2010

Я пытаюсь унаследовать класс от вектора C ++ и инициализировать его в конструкторе.Как мне это сделать?Например:

class Dataset:public std::vector<float>{
    public:
            Dataset(vector<float> val):*baseclass*(val){}
            // bruteforce way. // Dataset(vector<float> val){//for every val[i] call push_back(val[i]);}

Конечно, нет ничего, как baseclass , что я имею в виду под приведенным выше утверждением, что я хочу инициализировать данные вектора с помощью val.Как мне сделать это без push_back каждого элемента?

Ответы [ 2 ]

8 голосов
/ 23 декабря 2010

Не выводите из std::vector<>. Этот класс никогда не был предназначен для получения. Вместо этого используйте экземпляр класса в качестве члена:

struct Owns {
    Owns() : the_vector_(42, 128) { }

private:
    std::vector<float> the_vector_;
};
4 голосов
/ 23 декабря 2010

Вы можете написать:

Dataset(const vector<float> &val): std::vector<float>(val) {}

но, в конце концов, вы действительно не должны публично наследовать от std::vector. Есть несколько подсказок, которые показывают, что std::vector просто не предназначен для получения:

  • Нет виртуального деструктора
  • Нет защищенных членов
  • Нет виртуальных функций

Вы не можете запретить кому-либо рассматривать ваш Dataset объект как std::vector<float>, потому что публичное наследование означает, что Dataset является std::vector<float>, и это потерпит неудачу в случае попытки удалить объект Database с помощью указателя std::vector<float>.

Если вы хотите повторно использовать std::vector, либо используйте закрытый std::vector член, либо унаследуйте конфиденциально и выставьте то, что должно быть через using объявлений.

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