Вы должны использовать последнюю версию начальной загрузки, и она имеет встроенный 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>
Почему бы не передать размер нужного массива в качестве параметра в конструкторе базового класса?
(Причина, которую виртуальная функция не называет производным классом, состоит в том потому что, именно так виртуальные функции C++ работают; концептуально, пока конструктор производного класса не завершается, тип объекта является все еще базовым классом.)
Почему использование массив? Станд.:: вектор позволит Вам использовать в качестве многих параметрических усилителей по мере необходимости в производном классе с основой, не знающей (или заботящийся), в скольких требуется.
Что относительно того, чтобы делать размер параметром?
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;
Вы могли сделать это параметром конструктору, как предложили другие, но Вы могли также сделать Основу шаблонным классом с размером как параметр. Это имеет много преимуществ, таких как устранение необходимости массива, который будет выделен на "куче":
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; }
};
Мне нравятся и ответы Earwicker и Steve, в зависимости от того, что требуется. Если существуют многие из этих объектов, создаваемых и уничтожаемых часто, то Вы хотите минимальное количество возможного выделения памяти, и таким образом Earwicker выше. Однако, если бы это - что-то, что это обычно "создается и редко переделывается", затем я пошел бы с ответом Steve, поскольку карты просто обычно намного легче работать с и вырасти динамично по мере необходимости, но является, вероятно, слишком много служебным, если этот объект - то, чтобы это было сделанным и уничтожил много.
Я рассмотрел бы использование станд.:: карта. Это может вырасти с основой и получило обоих не заботящихся о количестве параметров другое использование. Пары ключ/значение, вероятно, легче управлять этим числовые индексы, хотя это является явно зависящим от приложения.