Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | | |
Неверно 23.07.02 10:16 Число просмотров: 1430
Автор: PS <PS> Статус: Elderman
|
нет у него типа. На сколько я понимаю, компилятор найдя {} смотрит - новый ли это блок или инициализация структуры. Для второго случая должно быть выражение, слева стоять структура. Если так и есть - генерится mov. Если выражения нет - считается что это новый блок.
|
<programming>
|
[C++] Научите писать a = {1, 2} 20.07.02 06:38
Автор: Biasha <Бяша> Статус: Member
|
Есть класс (структура) скажем
class Ca
{
public:
int i1;
int i2;
protected:
int i3; // = i1+i2
};
---
Хочется писать
Ca a = {1, 2};
---
И чтоб при этом автоматически посчиталось i3.
Возможно ли в с++ конструктор какой-то объявить для этих целей или оператор?
|
|
[C++] Научите писать a = {1, 2} 02.08.02 10:08
Автор: Lee Статус: Незарегистрированный пользователь
|
> Есть класс (структура) скажем > > class Ca
> {
> public:
> int i1;
> int i2;
> protected:
> int i3; // = i1+i2
> };
> ---
> Хочется писать > > Ca a = {1, 2};
> ---
> И чтоб при этом автоматически посчиталось i3. > Возможно ли в с++ конструктор какой-то объявить для этих > целей или оператор?
Ну можно типа так:
class Ca{
public:
Ca(int a, int b);
private:
int i1;
int i2;
int i3;
}
Ca::Ca(int a, int b){
i1 = a;
i2 = b;
i3 = i1 + i2;
}
---
А вызываешь так:
c = new Ca(2, 3);
---
P.S. Отсутствие ошибок не гарантирую.
|
| |
[C++] Так каждый умеет... 03.08.02 03:20
Автор: Biasha <Бяша> Статус: Member
|
|
|
[C++] А попробуй так 31.07.02 19:50
Автор: vim Статус: Незарегистрированный пользователь
|
> Есть класс (структура) скажем > > 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
|
esli ne vazhno { or ( togda mozhno tak:
struct AA{int i1; int i2;};
#define return(a,b) {AA aa = {a,b};return aa;}
AA f(void)
{
return (5,6);
}
void main()
{
AA bb;
bb = f();
return;
}
---
> Есть класс (структура) скажем > > class Ca
> {
> public:
> int i1;
> int i2;
> protected:
> int i3; // = i1+i2
> };
> ---
> Хочется писать > > Ca a = {1, 2};
> ---
> И чтоб при этом автоматически посчиталось i3. > Возможно ли в с++ конструктор какой-то объявить для этих > целей или оператор?
|
| |
[C++] Это понятно. Нет - принципиально важно :) 24.07.02 04:36
Автор: Biasha <Бяша> Статус: Member
|
|
|
Кстати фича 23.07.02 10:48
Автор: PS <PS> Статус: Elderman
|
имеем структуру A например из int a,b,c,d,e;
Как её обнулить ? стандартно через memset. А в MSDEV можно и A = {0};
Все остальное компилер сам поставит в 0. очень удобно. Главное не забыть, что это специфик :)
|
|
имхо, нельзя 21.07.02 20:11
Автор: PS <PS> Статус: Elderman
|
> Есть класс (структура) скажем > > 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
|
нельзя с классами пусть будет со структурами (хотя структура тот же класс, кстати).
Хочу писать
struct Sab
{
int a;
int b;
};
Sab f()
{
return {1, 2};
}
---
|
| | |
Незя :) 22.07.02 11:58
Автор: PS <PS> Статус: Elderman
|
> нельзя с классами пусть будет со структурами (хотя > структура тот же класс, кстати). > > Хочу писать > > struct Sab
> {
> int a;
> int b;
> };
>
> Sab f()
> {
> return {1, 2};
> }
> ---
А вот почему незя - объяснить не могу. В принципе ничего не стоило сделать реализацию такой фичи.
Может Кернигана и Ричи почитать ?
Кстати gcc тоже не поддерживает такую запись.
|
| | | |
Просто нужно знать тип {1, 2}... 23.07.02 01:15
Автор: Biasha <Бяша> Статус: Member
|
|
| | | | |
Неверно 23.07.02 10:16
Автор: PS <PS> Статус: Elderman
|
нет у него типа. На сколько я понимаю, компилятор найдя {} смотрит - новый ли это блок или инициализация структуры. Для второго случая должно быть выражение, слева стоять структура. Если так и есть - генерится 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
|
> > > > Ca a = {1, 2};
> > ---
вариант:
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);
---
|
| | |
[C++] Научите писать a = {1, 2} 20.07.02 21:46
Автор: Biasha <Бяша> Статус: Member
|
> вариант: > > 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
|
> а я хочу: C равно =)zero,three(=. > ХОЧУ, ХОЧУ
Да, хочу!
> - сначала попробуй переопределить оператор =,
А чё там пробовать? Ну переопределю, только вот каков тип {1, 2}?
> потом разберись что происходит при {1,2} - как можно > указать > эту @#!$ в качестве параметра оператора.
В том то и дело. Не знаю я как указать.
> И еще смотри MSDN что касается VC++. Там я думаю почти все > написано, ведь VC++ тоже не резиновая.
Ага, "прочитай дружок MSDN". :)
> Абсолютно весь > стандарт C++ по-моему до конца нигде не реализован.
Та ошибка про которую я писал в P.S. не имеет к этому отношения.
Сомневаюсь, что в данном случае столкнусь с нереализованными моментами.
> Если че > замени компилятор у VC++ на какой-нибудь другой.
Спасибо, это устраивает :)
> И вообще посмотри на http://compilers.net - не сайт а > сказка!!!
|
| | | | | |
[C++] ну вы, блин, даете 23.07.02 11:53
Автор: LVI Статус: Незарегистрированный пользователь
|
> > а я хочу: C равно =)zero,three(=. > > ХОЧУ, ХОЧУ > > Да, хочу! >
Почитай спецификацию на С и С++ !!! фигурные скобки "{}" это НЕ ОПЕРАТОР!!!
И, поэтому, ничего не выйдет
|
| | | | | | |
[C++] И не нужно ему быть оператором - нужно типом :) 24.07.02 02:01
Автор: Biasha <Бяша> Статус: Member
|
|
|
|