Как выделить массив в основном конструкторе с размером на основе производного класса?

Вы должны использовать последнюю версию начальной загрузки, и она имеет встроенный CSS:

Пример:

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"/>
<div class="progress">
  <div class="progress-bar" role="progressbar" style="width: 25%;" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100">25%</div>
</div>
<br><br>
<div class="progress">
  <div class="progress-bar" role="progressbar" style="width: 15%" aria-valuenow="15" aria-valuemin="0" aria-valuemax="100">10%</div>
  <div class="progress-bar bg-success" role="progressbar" style="width: 30%" aria-valuenow="30" aria-valuemin="0" aria-valuemax="100">20%</div>
  <div class="progress-bar bg-info" role="progressbar" style="width: 20%" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100">30%</div>
</div>

5
задан Community 23 May 2017 в 12:20
поделиться

6 ответов

Почему бы не передать размер нужного массива в качестве параметра в конструкторе базового класса?

(Причина, которую виртуальная функция не называет производным классом, состоит в том потому что, именно так виртуальные функции C++ работают; концептуально, пока конструктор производного класса не завершается, тип объекта является все еще базовым классом.)

5
ответ дан 13 December 2019 в 19:36
поделиться

Почему использование массив? Станд.:: вектор позволит Вам использовать в качестве многих параметрических усилителей по мере необходимости в производном классе с основой, не знающей (или заботящийся), в скольких требуется.

2
ответ дан 13 December 2019 в 19:36
поделиться

Что относительно того, чтобы делать размер параметром?

class Base
{ static int nParms;
  virtual int getNParms() { return nParms;}
  float *parameters;
public:
  Base(int n = nParams) 
  { parameters= new float[n];
    parameters[0] = globalRelodableX;
    parameters[1] = globalRelodableY;
  }
};
int Base::nParams =2;

class Derived : public Base
{ static int nParms;
  virtual int getNParms() { return nParms;}
public:
  Derived() : Base(nParams)
  { parameters[2] = globalRelodableZ;
  }
}
int Derived::nParams =3;
2
ответ дан 13 December 2019 в 19:36
поделиться

Вы могли сделать это параметром конструктору, как предложили другие, но Вы могли также сделать Основу шаблонным классом с размером как параметр. Это имеет много преимуществ, таких как устранение необходимости массива, который будет выделен на "куче":

template <size_t nParams>
class Base
{
    float parameters[nParams];
public:
    Base()
    { // could use a static_assert(nParams > 1) here...
      parameters[0] = globalRelodableX;
      parameters[1] = globalRelodableY;
    }
};

class Derived : public Base<3>  // or whatever
{
public:
    Derived()
    { parameters[2] = globalRelodableZ; }
};
2
ответ дан 13 December 2019 в 19:36
поделиться

Мне нравятся и ответы Earwicker и Steve, в зависимости от того, что требуется. Если существуют многие из этих объектов, создаваемых и уничтожаемых часто, то Вы хотите минимальное количество возможного выделения памяти, и таким образом Earwicker выше. Однако, если бы это - что-то, что это обычно "создается и редко переделывается", затем я пошел бы с ответом Steve, поскольку карты просто обычно намного легче работать с и вырасти динамично по мере необходимости, но является, вероятно, слишком много служебным, если этот объект - то, чтобы это было сделанным и уничтожил много.

0
ответ дан 13 December 2019 в 19:36
поделиться

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

0
ответ дан 13 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

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