Наследовать массив, который инициализирован в дочернем

#c #arrays #inheritance

#c #массивы #наследование

Вопрос:

Я ищу лучший способ сделать что-то вроде этого:

 class variable{
    protected:
    variable()
    int convert[][]
}

class weight: variable{
    public:
    weight(){
        convert = {{1,2},{1,3},{2,5}}
    }
  

Теперь я знаю, что не могу этого сделать, поскольку я должен заранее объявить размер массива. У меня есть много классов, все они наследуются от переменной базового класса, а переменная имеет функцию, использующую convert, поэтому не хочу объявлять convert в каждом из них отдельно. Для каждого класса длина массива будет оставаться постоянной, поэтому использование списка кажется ненужным.
Каковы ваши предложения.

Большое спасибо.

Комментарии:

1. Итак, в чем проблема? Это неясно из вашего описания. Вам нужен разный размер массива в разных производных классах или что?

2. Я не совсем понимаю, в чем ваша проблема, но похоже, что вы наследуете для повторного использования, а не для расширения, поэтому вы можете захотеть еще раз взглянуть на свой дизайн, чтобы увидеть, будет ли композиция служить вам лучше.

Ответ №1:

Существует несколько вариантов.

  • Используйте std::vector .
  • Или использовать std::array (доступно только в C 11)
  • Или сделать что-то вроде этого:

     template<size_t M, size_t N>
    class variable{
       protected:
         int convert[M][N];
    };
    
    class weight: variable<3,2>{
    public:.
     weight(){
       //convert = {{1,2},{1,3},{2,5}} //you cannot do this for arrays
       //but you can do this:
       int temp[3][2] = {{1,2},{1,3},{2,5}};
       std::copy(amp;temp[0][0], amp;temp[0][0]   (3*2), amp;convert[0][0]);
    };
      
  • Или вы также можете использовать std::vector or std::array вместе с template.

Комментарии:

1. Большое спасибо, поэтому с опцией template мне пришлось бы назначать каждый компонент по отдельности, нет способа отложить замедление до дочернего класса. Кажется, мне все-таки лучше всего использовать вектор или массив.

2. @wookie1: Даже с std::vector вы не сможете заполнить его таким образом, если не умеете использовать C 11.

3. Отлично, вы были действительно полезны.

Ответ №2:

Кажется, что лучше использовать частный чисто виртуальный метод в базовом классе и реализовать его в производных классах. Неясно, всегда ли ваш массив «convert» имеет два измерения, поэтому я использую «ваш тип» вместо реального типа, который должен храниться в возвращаемом контейнере. Приблизительно это будет выглядеть следующим образом:

 class variable {
private:
    virtual std::vector<"your type"> getConvertMatrix() const = 0;

    void someMethodThatNeedsConvertMatrix() {
        // ...
        std::vector<"your type"> convertMatrix = getConvertMatrix();
        // ...
    }
}

class weight : public variable {
private:

    virtual std::vector<"your type"> getConvertMatrix() const {
        // your implementation
        // form vector and return it, or return vector declared as member
    }
}