> class Ca
> {
> public:
> int i1;
> int i2;
> protected:
> int i3; // = i1+i2
> };
>
---
> Хочется писать >
> Ca a = {1, 2};
>
---
> И чтоб при этом автоматически посчиталось i3. > Возможно ли в с++ конструктор какой-то объявить для этих > целей или оператор?
Попробуй так, может заработает (сам проверить не могу, что-то со средой не в порядке).
Идея в том чтобы перегрузить оператор = для массива из двух константных интов:
class A
{
public:
int i1;
int i2;
int i3; // i1 + i2
void print() { printf("\n%d %d %d\n", i1, i2, i3); };
operator = (const int[2] x) { i1=x[0]; i2=x[1]; i3=i1+i2; };
};
void main()
{
A a = {1,2};
a.print();
}
По сути что происходит?
Ты объявляешь переменную а типа А и инициализируешь ее.
Тоже самое что int a = 10; только тип данных другой.
Если бы справа стоял операнд типа класса А, то ты бы смог выполнить присвоение без проблем. Поэтому тебе нужно определить оператор = для объекта другого типа, а именно массив из двух константных интов.
Попробуй может заработает, если нет попробуй какие-нибудь вариации на эту же тему...
Хотя если быть более точным, то в твоем случае ты создаешь новую переменную А а и сразу же инициализируешь ее. Поэтому лучше тебе создать конструктор для массива из двух константных интов.
[C++] А попробуй так31.07.02 21:43 Автор: + <Mikhail> Статус: Elderman
Ege, Voobcheto on eto i pisal iznachalno, tolko
operator = ni kogda ne budet vyzyvatsia, potomuchto proishodit initialization of class A t.k etot class ne imeet ctor i est` 2 public members kotorye i inicializiruutsia v dannom sluchae.
> > Есть класс (структура) скажем > >
> > class Ca
> > {
> > public:
> > int i1;
> > int i2;
> > protected:
> > int i3; // = i1+i2
> > };
> >
---
> > Хочется писать > >
> > Ca a = {1, 2};
> >
---
> > И чтоб при этом автоматически посчиталось i3. > > Возможно ли в с++ конструктор какой-то объявить для > этих > > целей или оператор? > > Попробуй так, может заработает (сам проверить не могу, > что-то со средой не в порядке). > > Идея в том чтобы перегрузить оператор = для массива из двух > константных интов: > > class A > { > public: > int i1; > int i2; > int i3; // i1 + i2 > void print() { printf("\n%d %d %d\n", i1, i2, i3); }; > operator = (const int[2] x) { i1=x[0]; i2=x[1]; i3=i1+i2; > }; > }; > > void main() > { > A a = {1,2}; > a.print(); > } > > По сути что происходит? > Ты объявляешь переменную а типа А и инициализируешь ее. > Тоже самое что int a = 10; только тип данных другой. > Если бы справа стоял операнд типа класса А, то ты бы смог > выполнить присвоение без проблем. Поэтому тебе нужно > определить оператор = для объекта другого типа, а именно > массив из двух константных интов. > > Попробуй может заработает, если нет попробуй какие-нибудь > вариации на эту же тему... > > Хотя если быть более точным, то в твоем случае ты создаешь > новую переменную А а и сразу же инициализируешь ее. Поэтому > лучше тебе создать конструктор для массива из двух > константных интов.
[C++] Научите писать a = {1, 2}24.07.02 02:54 Автор: + <Mikhail> Статус: Elderman
имеем структуру A например из int a,b,c,d,e;
Как её обнулить ? стандартно через memset. А в MSDEV можно и A = {0};
Все остальное компилер сам поставит в 0. очень удобно. Главное не забыть, что это специфик :)
> class Ca
> {
> public:
> int i1;
> int i2;
> protected:
> int i3; // = i1+i2
> };
>
---
> Хочется писать >
> Ca a = {1, 2};
>
---
> И чтоб при этом автоматически посчиталось i3. > Возможно ли в с++ конструктор какой-то объявить для этих > целей или оператор?
Во первых: Ca a = {1, 2}; генерит такую последовательность
mov DWORD PTR _a$[ebp], 1
mov DWORD PTR _a$[ebp+4], 2
xor eax, eax
mov DWORD PTR _a$[ebp+8], eax
Как видишь не вызывается ни каких конструкторов или операторов. Компилятор рассматривает такую запись как инициализацию структуры.
Для того что бы структура все же стала классом в неё надо добавить конструкор(ы). И сразу нарвешся на ошибку:
Compiler Error C2552
'identifier' : non-aggregates cannot be initialized with initializer list
The specified identifier was incorrectly initialized.
An initializer list is needed to initialize the following types:
An array
A class, structure, or union that does not have constructors, private or protected members, base classes, or virtual functions
These types are known as “aggregates.”
Имхо, все верно: структура отдельно, класс отдельно. Структуру можно инициализировать {}, для классов же были придуманы конструкторы.
Вот тут подумал, а какой код должен был бы сгенерить компилятор если бы работал так как ты хочешь...
Он должен был бы создать один временный объект (типа структура), проиницализировать его как структуру. После вызвать конструктор копирования и уничножить временный класс.
Что имеем: полную несовместимость с С конструкцией, накладные расходы по коду и времени исполнения.
В принципе это возмоожно, но стоит ли того ?
И потом, делать такую феньку только для базовых типов - пустая трата времени. Нормальный класс обычно содержит в себе конструкторы, объекты, приват методы и пр... И как с этим справится компилятор.
Допустим создает он такой временный объект, а там CString. Одним mov не обойдешся. И что ему вызывать ? Конструктор пустой он ему уже вызвал, остается только оператор присваевания... А если такой не предусмотрен...
Спроектировать такой компилятор - ж.. Скорость работы у него будет - ж.. Объем кода - ж.. Скорость исполнения - ж..
Куда не кинь - сплошная задница :)
Может лучше оставить все как есть и отделять классы от структур ?
ладно,21.07.02 22:40 Автор: Biasha <Бяша> Статус: Member
нет у него типа. На сколько я понимаю, компилятор найдя {} смотрит - новый ли это блок или инициализация структуры. Для второго случая должно быть выражение, слева стоять структура. Если так и есть - генерится mov. Если выражения нет - считается что это новый блок.
[C++] Научите писать a = {1, 2}20.07.02 15:04 Автор: vh <Дмитрий> Статус: Member
> class Ca
> {
> public:
> int i1;
> int i2;
> protected:
> int i3; // = i1+i2
> };
>
---
> Хочется писать >
> Ca a = {1, 2};
>
---
> И чтоб при этом автоматически посчиталось i3. > Возможно ли в с++ конструктор какой-то объявить для этих > целей или оператор? как я понимаю здесь можно обойтись описанием оператора.
как конкретно? если надо могу посмотреть в книжке что на полке лежит :)
[C++] Научите писать a = {1, 2}20.07.02 15:16 Автор: ggg <ggg> Статус: Elderman
> class Ca
> {
> public:
> Ca(int _i1, int _i2)
> {
> i1 = _i1;
> i2 = _i2;
> i3 = i1+i2;
> };
> };
>
> Ca a = Ca(1,2);
> Ca a2(1,2);
> Ca a3;
> a3 = Ca(1,2);
>
>
---
Такой вариант я и сам написать могу. Только неинтересно, хочется именно {}.
И чтоб потом можно было писать, скажем, return {1, 2};
Структуры же можно инициализировать Sa a = {1, 2}; вот и хочеться развить эту идею.
2vh:
> > как я понимаю здесь можно обойтись описанием оператора. Ну, это и я понимаю :), если это конечно вообще возможно.
P.S.
А не перегибаю ли я с конструкциями :)
Вчера получил C3206:
This error is generated for code allowed by the C++ language, however, not yet supported by Visual C++.
Стоит VS .NET...
[C++] Научите писать a = {1, 2}21.07.02 16:33 Автор: Zplaint Статус: Незарегистрированный пользователь
а я хочу: C равно =)zero,three(=.
ХОЧУ, ХОЧУ - сначала попробуй переопределить оператор =,
потом разберись что происходит при {1,2} - как можно указать
эту @#!$ в качестве параметра оператора.
И еще смотри MSDN что касается VC++. Там я думаю почти все написано, ведь VC++ тоже не резиновая. Абсолютно весь стандарт C++ по-моему до конца нигде не реализован. Если че замени компилятор у VC++ на какой-нибудь другой.
И вообще посмотри на http://compilers.net - не сайт а сказка!!!
[C++] Научите писать a = {1, 2}21.07.02 22:32 Автор: Biasha <Бяша> Статус: Member