информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Неверно 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
<"чистая" ссылка>
1  |  2 >>  »  




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach