Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как задать константу в классе?

8.1K
30 июля 2005 года
cupec
33 / / 26.06.2005
Например

MyClass
{
MyClass();
~MyClass();

const int m_myConst;
m_NCar[m_myConst];
}

что то вроде такого, т.е, чтобы я мог пользоваться ей и в производных классах (ну не нравятся мне динамические массивы).
1.9K
30 июля 2005 года
solovey
113 / / 25.07.2004
Цитата:
Originally posted by cupec
Например

MyClass
{
public:
MyClass();
~MyClass();

protected:
const int m_myConst;
private:
m_NCar[m_myConst];
}

что то вроде такого, т.е, чтобы я мог пользоваться ей и в производных классах (ну не нравятся мне динамические массивы).

2.0K
31 июля 2005 года
WidowMaker
212 / / 05.04.2005
Цитата:
Originally posted by solovey


Так не куда не годится,:) потому, что описывая
класс или структуру мы должны задать все поля, т.е. указать их размер, а статический массив у тебя задан неопределенной переменной.
И это еще не все...

1.9K
31 июля 2005 года
solovey
113 / / 25.07.2004
Цитата:
Originally posted by WidowMaker
Так не куда не годится,:) потому, что описывая
класс или структуру мы должны задать все поля, т.е. указать их размер, а статический массив у тебя задан неопределенной переменной.
И это еще не все...

хммм... я отвечал на вопрос "Как объявить константу, чтобы к ней можно было обращаться в производном классе?" :) Про массив, я думаю, вы правы. Надо будет выделять память в конструкторе и освобождать в деструкторе.

2.0K
31 июля 2005 года
WidowMaker
212 / / 05.04.2005
Цитата:
Originally posted by solovey
хммм... я отвечал на вопрос "Как объявить константу, чтобы к ней можно было обращаться в производном классе?" :) Про массив, я думаю, вы правы. Надо будет выделять память в конструкторе и освобождать в деструкторе.



Я же говорил, что это еще не все:
как задать значение такой константы? а?
Вот, вот....:D

1.9K
31 июля 2005 года
solovey
113 / / 25.07.2004
Цитата:
Originally posted by WidowMaker
Я же говорил, что это еще не все:
как задать значение такой константы? а?
Вот, вот....:D

не знаю конечно, может по линии дедушки я происхожу от Гендальфа, но такой код у меня работает :)

Цитата:
class A
{
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;
}

12K
31 июля 2005 года
gbt
6 / / 31.07.2005
Цитата:
Originally posted by cupec

MyClass
{
MyClass();
~MyClass();

static const int m_myConst = 10;
m_NCar[m_myConst];
}

8.1K
01 августа 2005 года
cupec
33 / / 26.06.2005
если переменную класса обявить статической, то она будет одинаковой для всех экземпляров, мне не подходит
8.1K
01 августа 2005 года
cupec
33 / / 26.06.2005
Цитата:
Originally posted by gbt



код реально не работает

2.0K
01 августа 2005 года
WidowMaker
212 / / 05.04.2005
Цитата:
Originally posted by solovey
не знаю конечно, может по линии дедушки я происхожу от Гендальфа, но такой код у меня работает :)


Может быть:) ...

12K
01 августа 2005 года
gbt
6 / / 31.07.2005
Цитата:
Originally posted by cupec
если переменную класса обявить статической, то она будет одинаковой для всех экземпляров, мне не подходит


#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;
}

12K
01 августа 2005 года
gbt
6 / / 31.07.2005
Цитата:
Originally posted by cupec
код реально не работает


На MSVC 6 и не будет, она стандарт очень криво поддерживает, а на 7, 7.1 - работает.

3
01 августа 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by WidowMaker
Я же говорил, что это еще не все:
как задать значение такой константы? а?
Вот, вот....:D



Константы класса инициализируются в так называемом списке инициализаций (initializer list), как это показал solovey.

Исходя из этого, нестатические константы класса нельзя использовать при задании размерности массива-члена класса.

Статический член действительно будет один для всех экземпляров данного класса.

Если тебе действительно необходим массив как член класса, что само по себе не совсем верно, да ещё и различной размерности, что совсем не верно, то есть единственный способ - создать столько классов, сколько различных размерностей массивов в них тебе надо.
Ьлаго, что в С++ для этих целей имеются шаблоны:

 
Код:
template<int ArraySize>
MyClass
{
MyClass() {}
int m_NCar[ArraySize];
}

В принципе специальную константу для получения в потомках размерности массива заводить не надо. Размерность можно выяснить так:
 
Код:
sizeof(m_NCar)/sizeof(m_NCar[0])


Что же касается правильного подхода, то желательно не делать массивы членами класса, а использовать контейнеры или выделять память в рантайме.
8.1K
02 августа 2005 года
cupec
33 / / 26.06.2005
Цитата:
Originally posted by Green
Константы класса инициализируются в так называемом списке инициализаций (initializer list), как это показал solovey.

Исходя из этого, нестатические константы класса нельзя использовать при задании размерности массива-члена класса.

Статический член действительно будет один для всех экземпляров данного класса.

Если тебе действительно необходим массив как член класса, что само по себе не совсем верно, да ещё и различной размерности, что совсем не верно, то есть единственный способ - создать столько классов, сколько различных размерностей массивов в них тебе надо.
Ьлаго, что в С++ для этих целей имеются шаблоны:
 
Код:
template<int ArraySize>
MyClass
{
MyClass() {}
int m_NCar[ArraySize];
}

В принципе специальную константу для получения в потомках размерности массива заводить не надо. Размерность можно выяснить так:
 
Код:
sizeof(m_NCar)/sizeof(m_NCar[0])


Что же касается правильного подхода, то желательно не делать массивы членами класса, а использовать контейнеры или выделять память в рантайме.



для меня это новые вещи, можно по подробнее?

3
02 августа 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by cupec
для меня это новые вещи, можно по подробнее?



Что именно из вышесказанного?

8.1K
05 августа 2005 года
cupec
33 / / 26.06.2005
вот это -
Цитата:
Originally posted by Green
Что же касается правильного подхода, то желательно не делать массивы членами класса, а использовать контейнеры или выделять память в рантайме.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог