Инициализация статических членов
От: Аноним  
Дата: 28.11.05 09:16
Оценка:
При инициализации статических членов, С++ позволяет это делать внутри себя только для константных интегральных типов.

То есть нельзя написать

class SomeClass
{
cons static std::string Str = "Str";
};

а надо инициализировать Str в единице трансляции

Вопрос, а какими практическими соображениями вызвано данное ограничение?
В Java, к примеру, так делать можно.
Re: Инициализация статических членов
От: lLPl  
Дата: 28.11.05 09:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вопрос, а какими практическими соображениями вызвано данное ограничение?

А>В Java, к примеру, так делать можно.

class Y {
    const int c3 = 7;        // error: not static
    static int c4 = 7;        // error: not const
    static const float c5 = 7;    // error not integral
};


...

So why do these inconvenient restrictions exist? A class is typically declared in a header file and
a header file is typically included into many translation units. However, to avoid complicated linker rules,
C++ requires that every object has a unique definition. That rule would be broken if C++ allowed in-class definition of entities
that needed to be stored in memory as objects. See D&E for an explanation of C++'s design tradeoffs.

http://www.research.att.com/~bs/bs_faq2.html#in-class

P.S. Кстати, кто-нибудь знает где раздобыть D&E в электронном виде?
C++ можно выучить за 21 день! ...если дни — полярные.
Re[2]: Инициализация статических членов
От: lLPl  
Дата: 28.11.05 09:43
Оценка:
Здравствуйте, lLPl, Вы писали:

В общем, как я понял, это запрещено, т.к. нарушает ODR и создает проблемы линкеру.
С интегральными константами проблем нет, наверное, потому что компилятор подставляет их как define-макросы.
C++ можно выучить за 21 день! ...если дни — полярные.
Re[3]: Инициализация статических членов
От: Аноним  
Дата: 28.11.05 09:47
Оценка:
Здравствуйте, lLPl, Вы писали:

LP>Здравствуйте, lLPl, Вы писали:


LP>В общем, как я понял, это запрещено, т.к. нарушает ODR и создает проблемы линкеру.

LP>С интегральными константами проблем нет, наверное, потому что компилятор подставляет их как define-макросы.

Спасибо, примерно так и думал
Re: Инициализация статических членов
От: Шахтер Интернет  
Дата: 28.11.05 09:57
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>При инициализации статических членов, С++ позволяет это делать внутри себя только для константных интегральных типов.


А>То есть нельзя написать


А>class SomeClass

А>{
А>const static std::string Str = "Str";
А>};

А>а надо инициализировать Str в единице трансляции


А>Вопрос, а какими практическими соображениями вызвано данное ограничение?


Никакими. Это просто историческая традиция.

А>В Java, к примеру, так делать можно.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: Инициализация статических членов
От: MaximE Великобритания  
Дата: 28.11.05 14:37
Оценка: 7 (3) -1
On Mon, 28 Nov 2005 09:16:05 -0000, wrote:

> При инициализации статических членов, С++ позволяет это делать внутри себя только для константных интегральных типов.

>
> То есть нельзя написать
>
> class SomeClass
> {
> cons static std::string Str = "Str";
> };
>
> а надо инициализировать Str в единице трансляции
>
> Вопрос, а какими практическими соображениями вызвано данное ограничение?
> В Java, к примеру, так делать можно.

И в С++ можно сделать. Нужно лишь вспомнить, что для статических членов шаблонов ODR ослаблен.

template<int dummy>
struct statics
{
     static std::string const str;
};

template<int dummy>
std::string const statics<dummy>::str("blah");

struct some : statics<0>
{
};


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.