#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
orstd::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
}
}