Инициализация.
От: SergeyBi  
Дата: 15.09.04 13:00
Оценка:
Пусть у меня есть некая структура:


struct A
{
    int a;
    int b;
};


Я могу заводить объект структуры и сразу задавать значения следущим способом:


A a = {0,0};



А как мне быть если я хочу воспользоваться чем-то подобным в списке инициализации в конструкторе...


SomeClass::SomeClass():
a{0,0}// что здесь написать чтобы работало?
{

}



Опережая вопросы сразу скажу зачем мне это надо. У структуры нет конструкторов. И я хочу ее конструировать в списке инициализации.(чтобы сначала не работал конструктор по умолчанию). Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...
Re: Инициализация.
От: Esperar  
Дата: 15.09.04 13:02
Оценка:
Здравствуйте, SergeyBi, Вы писали:

SB>Пусть у меня есть некая структура:



SB>
SB>struct A
SB>{
SB>    int a;
SB>    int b;
SB>};
SB>


SB>Я могу заводить объект структуры и сразу задавать значения следущим способом:



SB>
SB>A a = {0,0};
SB>



SB>А как мне быть если я хочу воспользоваться чем-то подобным в списке инициализации в конструкторе...



SB>
SB>SomeClass::SomeClass():
SB>a{0,0}// что здесь написать чтобы работало?
SB>{

SB>}
SB>



SB>Опережая вопросы сразу скажу зачем мне это надо. У структуры нет конструкторов. И я хочу ее конструировать в списке инициализации.(чтобы сначала не работал конструктор по умолчанию). Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...



class A{
   int a,b;
public:
   a(0), b(0) {/*...*/}

};
Re: Инициализация.
От: korzhik Россия  
Дата: 15.09.04 13:03
Оценка:
Здравствуйте, SergeyBi, Вы писали:

SB>Опережая вопросы сразу скажу зачем мне это надо. У структуры нет конструкторов. И я хочу ее конструировать в списке инициализации.(чтобы сначала не работал конструктор по умолчанию). Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...


без конструктора не обойдёшься
Re[2]: Инициализация.
От: Esperar  
Дата: 15.09.04 13:03
Оценка:
Здравствуйте, Esperar, Вы писали:

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


SB>>Пусть у меня есть некая структура:



SB>>
SB>>struct A
SB>>{
SB>>    int a;
SB>>    int b;
SB>>};
SB>>


SB>>Я могу заводить объект структуры и сразу задавать значения следущим способом:



SB>>
SB>>A a = {0,0};
SB>>



SB>>А как мне быть если я хочу воспользоваться чем-то подобным в списке инициализации в конструкторе...



SB>>
SB>>SomeClass::SomeClass():
SB>>a{0,0}// что здесь написать чтобы работало?
SB>>{

SB>>}
SB>>



SB>>Опережая вопросы сразу скажу зачем мне это надо. У структуры нет конструкторов. И я хочу ее конструировать в списке инициализации.(чтобы сначала не работал конструктор по умолчанию). Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...


исправился типа:
E>
E>class A{
E>   int a,b;
E>public:
E>   A():a(0), b(0) {/*...*/}

E>};
E>
Re: Инициализация.
От: Анатолий Широков СССР  
Дата: 15.09.04 13:07
Оценка: 9 (4) +2
inline A make_A(int a, int b)
{
   A temp = {a, b};
   return temp;
}

SomeClass::SomeClass():
   a(make_A(0, 10))
{
}
Re[3]: Инициализация.
От: SergeyBi  
Дата: 15.09.04 13:09
Оценка:
E>>
E>>class A{
E>>   int a,b;
E>>public:
E>>   A():a(0), b(0) {/*...*/}

E>>};
E>>


И что это ? Структура не моя, я не могу ее править, иначе добавилбы конструкторы в нее.
Re[4]: Инициализация.
От: Esperar  
Дата: 15.09.04 13:35
Оценка:
Здравствуйте, SergeyBi, Вы писали:


E>>>
E>>>class A{
E>>>   int a,b;
E>>>public:
E>>>   A():a(0), b(0) {/*...*/}

E>>>};
E>>>


SB>И что это ? Структура не моя, я не могу ее править, иначе добавилбы конструкторы в нее.

но ты ведь можешь от неё наследоваться
Re: Инициализация.
От: Аноним  
Дата: 15.09.04 17:10
Оценка:
SB>Я могу заводить объект структуры и сразу задавать значения следущим способом:
SB>
SB>A a = {0,0};
SB>


SB>А как мне быть если я хочу воспользоваться чем-то подобным в списке инициализации в конструкторе...

SB>
SB>SomeClass::SomeClass():
SB>a{0,0}// что здесь написать чтобы работало?
SB>


SomeClass::SomeClass : a(0), b(0) { }


SB>Опережая вопросы сразу скажу зачем мне это надо. У структуры нет конструкторов. И я хочу ее конструировать в списке инициализации.(чтобы сначала не работал конструктор по умолчанию). Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...


Что-то вопрос непонятен. О каком конструкторе речь? Пишите или конструктор как показано выше или просто ставьте const перед инициализацией через скобки: const A a = { 0, 0 };

Censored. Нарушение п. 5. -- ПК
Re: Инициализация.
От: SergeyBi  
Дата: 16.09.04 08:03
Оценка:
предлагаю тому анониму, который дал "не традиционный" ответ постучать мне в аську, и я обсужу с ним тему, которая его волнует. (67945507)
Re[2]: Инициализация.
От: Аноним  
Дата: 16.09.04 09:04
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>
АШ>inline A make_A(int a, int b)
АШ>{
АШ>   A temp = {a, b};
АШ>   return temp;
АШ>}

АШ>SomeClass::SomeClass():
АШ>   a(make_A(0, 10))
АШ>{
АШ>}
АШ>


Думаю это не катит... человек же что говорит "чтобы сначала не работал конструктор по умолчанию" — видимо скорость критична!!! ну а в предложеном варианте аж временный объект создается
Re[3]: Инициализация.
От: Анатолий Широков СССР  
Дата: 16.09.04 09:14
Оценка:
А>Думаю это не катит... человек же что говорит "чтобы сначала не работал конструктор по умолчанию" — видимо скорость критична!!! ну а в предложеном варианте аж временный объект создается

Если оптимизатор правильно разберется в этой ситуации, то временного объекта может и не будет.
Re[4]: Инициализация.
От: Lapulya  
Дата: 16.09.04 10:54
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

А>>Думаю это не катит... человек же что говорит "чтобы сначала не работал конструктор по умолчанию" — видимо скорость критична!!! ну а в предложеном варианте аж временный объект создается


АШ>Если оптимизатор правильно разберется в этой ситуации, то временного объекта может и не будет.


Чегой-то у меня большие сомнения по этому поводу...
я еще могу понять это

typedef std::string String;

void f(String a)
{
// using a
...
}

{
...
f("abcd");
...
}

что он тут не создается ... но в приведенном примере не создавать временный оъбект??? как же ваш код должен работать... И потом всетаки полагаться на оптимизатор когда скорость критична мммммм я бы не стал...
Re[5]: Инициализация.
От: ssm  
Дата: 16.09.04 11:02
Оценка:
Здравствуйте, Lapulya, Вы писали:


L>я еще могу понять это


еще как cоздастся в "это"
http://www.rsdn.org/File/13021/angler.gif
Re[5]: Инициализация.
От: Анатолий Широков СССР  
Дата: 16.09.04 11:11
Оценка: 1 (1)
L>я еще могу понять это

L>что он тут не создается ...


Без комментариев.

L>но в приведенном примере не создавать временный оъбект??? как же ваш код должен работать...


Например, комплилятор вместо адрес объекта на стеке может подставить адрес this->a.

L>И потом всетаки полагаться на оптимизатор когда скорость критична мммммм я бы не стал...


Одним словом, надо профилировать, а не гадать на кофейной гуще. Если функция make_A окажется узким местов в системе, тогда и будем репу чесать
Re[6]: Инициализация.
От: Lapulya  
Дата: 16.09.04 11:13
Оценка:
Здравствуйте, ssm, Вы писали:

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



L>>я еще могу понять это


ssm>еще как cоздастся в "это"


Ну тут я и не спорю у меня сомнения по поводу этого

inline A make_A(int a, int b)
{
   A temp = {a, b};
   return temp;
}

SomeClass::SomeClass():
   a(make_A(0, 10))
{
}
Re[6]: Инициализация.
От: Lapulya  
Дата: 16.09.04 11:37
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

L>>я еще могу понять это


L>>что он тут не создается ...


АШ>Без комментариев.


L>>но в приведенном примере не создавать временный оъбект??? как же ваш код должен работать...


АШ>Например, комплилятор вместо адрес объекта на стеке может подставить адрес this->a.


L>>И потом всетаки полагаться на оптимизатор когда скорость критична мммммм я бы не стал...


АШ>Одним словом, надо профилировать, а не гадать на кофейной гуще. Если функция make_A окажется узким местов в системе, тогда и будем репу чесать


Да причем здесь гадания, человек ясно сказал что его жаба душит вызывать конструктор по умолчанию.... только и всего и то ничего не придумываю
Re[7]: Инициализация.
От: Анатолий Широков СССР  
Дата: 16.09.04 11:45
Оценка:
L>Да причем здесь гадания, человек ясно сказал что его жаба душит вызывать конструктор по умолчанию.... только и всего и то ничего не придумываю

В приведенном решении нет ни одного вызова конструктора по умолчанию!!! А вызова копирующего конструктора может и не быть, если оптимизатор сделает правильную подстановку (ведь функция объявлена как inline).
Re[8]: Инициализация.
От: Lapulya  
Дата: 16.09.04 12:04
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

L>>Да причем здесь гадания, человек ясно сказал что его жаба душит вызывать конструктор по умолчанию.... только и всего и то ничего не придумываю


АШ>В приведенном решении нет ни одного вызова конструктора по умолчанию!!! А вызова копирующего конструктора может и не быть, если оптимизатор сделает правильную подстановку (ведь функция объявлена как inline).


да я в общем не спорю я просто говорю, (еще разок код в студию)

inline A make_A(int a, int b)
{
   A temp = {a, b};
   return temp;
}

SomeClass::SomeClass():
   a(make_A(0, 10))
{
}


что для того что бы это работало быстрее чем вызов конструктора по умолчанию, а затем естессно заполненние членов нужными значениями, нодо
1. чтобы компилятор встроил код функции объявленной как inline.
2. чтобы оптимизатор не создавал временного объекта.
мне кажется это не лучший вариант , хотя если оба пункта выполнены это как раз то, чего хотел автор темы
Re[9]: Инициализация.
От: Анатолий Широков СССР  
Дата: 16.09.04 12:11
Оценка:
L>что для того что бы это работало быстрее чем вызов конструктора по умолчанию, а затем естессно заполненние членов нужными значениями, нодо
L>1. чтобы компилятор встроил код функции объявленной как inline.
L>2. чтобы оптимизатор не создавал временного объекта.

Эти два пункта можно заменить одним:
1) компилятор правильно встроил функцию

L>мне кажется это не лучший вариант , хотя если оба пункта выполнены это как раз то, чего хотел автор темы


Помимо этого, автор хотел, чтобы была возможность инициализировать константный член, а это невозможно сделать связкой A() + почленная инициализация. Цитирую:

Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...

Re[10]: Инициализация.
От: Lapulya  
Дата: 16.09.04 12:19
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

L>>что для того что бы это работало быстрее чем вызов конструктора по умолчанию, а затем естессно заполненние членов нужными значениями, нодо

L>>1. чтобы компилятор встроил код функции объявленной как inline.
L>>2. чтобы оптимизатор не создавал временного объекта.

АШ>Эти два пункта можно заменить одним:

АШ>1) компилятор правильно встроил функцию

L>>мне кажется это не лучший вариант , хотя если оба пункта выполнены это как раз то, чего хотел автор темы


АШ>Помимо этого, автор хотел, чтобы была возможность инициализировать константный член, а это невозможно сделать связкой A() + почленная инициализация. Цитирую:


АШ>

АШ>Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...


Я в общем на этом A() + почленная инициализация и не настаивал, можно же как было упомянуто, унаследоваться и запаять параметризованный конструктор, медленнее точно небылобы + почти не зависит от оптимизатора...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.