Как задать константу в классе?
MyClass
{
MyClass();
~MyClass();
const int m_myConst;
m_NCar[m_myConst];
}
что то вроде такого, т.е, чтобы я мог пользоваться ей и в производных классах (ну не нравятся мне динамические массивы).
Например
MyClass
{
public:
MyClass();
~MyClass();
protected:
const int m_myConst;
private:
m_NCar[m_myConst];
}
что то вроде такого, т.е, чтобы я мог пользоваться ей и в производных классах (ну не нравятся мне динамические массивы).
Так не куда не годится,:) потому, что описывая
класс или структуру мы должны задать все поля, т.е. указать их размер, а статический массив у тебя задан неопределенной переменной.
И это еще не все...
Так не куда не годится,:) потому, что описывая
класс или структуру мы должны задать все поля, т.е. указать их размер, а статический массив у тебя задан неопределенной переменной.
И это еще не все...
хммм... я отвечал на вопрос "Как объявить константу, чтобы к ней можно было обращаться в производном классе?" :) Про массив, я думаю, вы правы. Надо будет выделять память в конструкторе и освобождать в деструкторе.
хммм... я отвечал на вопрос "Как объявить константу, чтобы к ней можно было обращаться в производном классе?" :) Про массив, я думаю, вы правы. Надо будет выделять память в конструкторе и освобождать в деструкторе.
Я же говорил, что это еще не все:
как задать значение такой константы? а?
Вот, вот....:D
Я же говорил, что это еще не все:
как задать значение такой константы? а?
Вот, вот....:D
не знаю конечно, может по линии дедушки я происхожу от Гендальфа, но такой код у меня работает :)
{
public:
const int a;
A():a(1){};
};
int main()
{
A b;
std::cout<<b.a;
//b.a = 2; - если раскомментировать, то C2166: l-value specifies const object
return 0;
}
MyClass
{
MyClass();
~MyClass();
static const int m_myConst = 10;
m_NCar[m_myConst];
}
код реально не работает
не знаю конечно, может по линии дедушки я происхожу от Гендальфа, но такой код у меня работает :)
Может быть:) ...
если переменную класса обявить статической, то она будет одинаковой для всех экземпляров, мне не подходит
#include <vector>
MyClass
{
MyClass(int a_Const) : m_myConst(a_Const),
m_NCar(m_myConst) {}
const int m_myConst;
std::vector<int> m_NCar;
}
И обращаться так:
for (int i = 0; i < m_NCar.size(); ++i)
{
m_NCar = i * i;
}
код реально не работает
На MSVC 6 и не будет, она стандарт очень криво поддерживает, а на 7, 7.1 - работает.
Я же говорил, что это еще не все:
как задать значение такой константы? а?
Вот, вот....:D
Константы класса инициализируются в так называемом списке инициализаций (initializer list), как это показал solovey.
Исходя из этого, нестатические константы класса нельзя использовать при задании размерности массива-члена класса.
Статический член действительно будет один для всех экземпляров данного класса.
Если тебе действительно необходим массив как член класса, что само по себе не совсем верно, да ещё и различной размерности, что совсем не верно, то есть единственный способ - создать столько классов, сколько различных размерностей массивов в них тебе надо.
Ьлаго, что в С++ для этих целей имеются шаблоны:
MyClass
{
MyClass() {}
int m_NCar[ArraySize];
}
В принципе специальную константу для получения в потомках размерности массива заводить не надо. Размерность можно выяснить так:
Что же касается правильного подхода, то желательно не делать массивы членами класса, а использовать контейнеры или выделять память в рантайме.
Константы класса инициализируются в так называемом списке инициализаций (initializer list), как это показал solovey.
Исходя из этого, нестатические константы класса нельзя использовать при задании размерности массива-члена класса.
Статический член действительно будет один для всех экземпляров данного класса.
Если тебе действительно необходим массив как член класса, что само по себе не совсем верно, да ещё и различной размерности, что совсем не верно, то есть единственный способ - создать столько классов, сколько различных размерностей массивов в них тебе надо.
Ьлаго, что в С++ для этих целей имеются шаблоны:
MyClass
{
MyClass() {}
int m_NCar[ArraySize];
}
В принципе специальную константу для получения в потомках размерности массива заводить не надо. Размерность можно выяснить так:
Что же касается правильного подхода, то желательно не делать массивы членами класса, а использовать контейнеры или выделять память в рантайме.
для меня это новые вещи, можно по подробнее?
для меня это новые вещи, можно по подробнее?
Что именно из вышесказанного?
Что же касается правильного подхода, то желательно не делать массивы членами класса, а использовать контейнеры или выделять память в рантайме.