вызывает следующий напряг: [C++ Error] : E2492 Properties may only be assigned using a simple statement, e.g. "prop = value;"
В то время, как Borland C++5, Borland Builder1.0 и MSVC6 не имеют ни каких претензий к подобному коду.
Вопроса два:
1) почему вдруг стало необходимо накладывать ограничения на присвоения к пропертям?
2) Разве в стандарте чё-нить есть по этому поводу?
Здравствуйте Lummox, Вы писали: L>2) Разве в стандарте чё-нить есть по этому поводу?
На сколько я себе представляю, в стандарте вообще нет ничего о свойствах ("property"). Т.к. свойства — нестандартные расширения языка (я так понимаю, попавшие в Builder из Delphi в целях совместимости с библиотекой VCL.
L>вызывает следующий напряг: L>[C++ Error] : E2492 Properties may only be assigned using a simple statement, e.g. "prop = value;" L>В то время, как Borland C++5, Borland Builder1.0 и MSVC6 не имеют ни каких претензий к подобному коду. L>Вопроса два: L>1) почему вдруг стало необходимо накладывать ограничения на присвоения к пропертям?
Вполне логичное ограничение. Впрямую функциональность оператора '+=' через интерфейс проперти реализовать невозможно. А автоматически интерпретировать такую запись, как 'Button1->Height = Button1->Height + 30' — это совершенно не в стиле С++. Если тебе надо сделать 'Button1->Height = Button1->Height + 30' — так и пиши.
L>2) Разве в стандарте чё-нить есть по этому поводу?
В языке С++, как таковом, никаких проперти нет и в помине. Поэтому стандарт тут совершенно ни при чем. Это самодеятельность авторов компилятора. Как захотят — так и сделают.
L>>вызывает следующий напряг: L>>[C++ Error] : E2492 Properties may only be assigned using a simple statement, e.g. "prop = value;" L>>В то время, как Borland C++5, Borland Builder1.0 и MSVC6 не имеют ни каких претензий к подобному коду. L>>Вопроса два: L>>1) почему вдруг стало необходимо накладывать ограничения на присвоения к пропертям?
АТ>Вполне логичное ограничение. Впрямую функциональность оператора '+=' через интерфейс проперти реализовать невозможно. А автоматически интерпретировать такую запись, как 'Button1->Height = Button1->Height + 30' — это совершенно не в стиле С++. Если тебе надо сделать 'Button1->Height = Button1->Height + 30' — так и пиши.
1) Впрямую функциональность оператора '+=' через интерфейс проперти реализовать МОЖНО! У Билдера не с "+=" напряги возникли.
2) Билдер сказал, что "присвоение к пропертям возможно только при помощи простых операторов", тогда как опреатор
(Button1->Height+=30),(Button1->Width+=30);
является сложным (в нем на самом деле два оператора, разделенных запятой). Если заменить это на
{
Button1->Height+=30;
Button1->Width+=30;
}
, то ни каких проблем не возникает (хотя тут есть +=), поскольку присвоение осуществляется простыми операторами. Вопрос в следующем: ЗАЧЕМ НАКЛАДЫВАТЬ ОГРАНИЧЕНИЯ на присвоение к пропертям? Т.е. в более ранних версиях Билдера не было этого ораничения и по этому опреатор
(Button1->Height+=30),(Button1->Width+=30);
не вызывал ни каких вопросов.
Итак, кто нить знает ЗАЧЕМ НАКЛАДЫВАТЬ ОГРАНИЧЕНИЯ на присвоение к пропертям?
Здравствуйте Lummox, Вы писали:
АТ>>Вполне логичное ограничение. Впрямую функциональность оператора '+=' через интерфейс проперти реализовать невозможно. А автоматически интерпретировать такую запись, как 'Button1->Height = Button1->Height + 30' — это совершенно не в стиле С++. Если тебе надо сделать 'Button1->Height = Button1->Height + 30' — так и пиши. L> L>1) Впрямую функциональность оператора '+=' через интерфейс проперти реализовать МОЖНО! У Билдера не с "+=" напряги возникли.
Нет, нельзя.
Во-первых, замена '+=' на сложение с последующим присваиванием — это не впрямую.
Во-вторых, в С++ функциональность оператора '+=' никогда и нигде не эмулируется через сложение с присваиванием. '+=' — это совершенно самостоятельный оператор. За такие трюки писателям компилятора надо бить по рукам. Хотя, пропертям, как известно, закон не писан...
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Во-вторых, в С++ функциональность оператора '+=' никогда и нигде не эмулируется через сложение с присваиванием. '+=' — это совершенно самостоятельный оператор. За такие трюки писателям компилятора надо бить по рукам. Хотя, пропертям, как известно, закон не писан...
В каком смысле "не эмулируется"? В простых случаях реализация одинаковая:
int a = 0;
a++; a+=1; a=a+1;
Здесь реализация операций ++, +=, a=a+1 совершенно одинаковая.
Здравствуйте IT, Вы писали:
IT>А кто сказал, что это ограничение? Может это просто глюк. Хотели ребята из Борланда сделать как лучше, а получилось как всегда.
Но это именно ограничение, поскольку его нарушение влечет за собой вполне конкретную ошибку, а не unidetified behaviour или какую-нить Unknown Error (каковая как раз и возникает когда получается как всегда)
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Здравствуйте Lummox, Вы писали:
АТ>>>Вполне логичное ограничение. Впрямую функциональность оператора '+=' через интерфейс проперти реализовать невозможно. А автоматически интерпретировать такую запись, как 'Button1->Height = Button1->Height + 30' — это совершенно не в стиле С++. Если тебе надо сделать 'Button1->Height = Button1->Height + 30' — так и пиши. L>> L>>1) Впрямую функциональность оператора '+=' через интерфейс проперти реализовать МОЖНО! У Билдера не с "+=" напряги возникли.
АТ>Нет, нельзя.
АТ>Во-первых, замена '+=' на сложение с последующим присваиванием — это не впрямую.
АТ>Во-вторых, в С++ функциональность оператора '+=' никогда и нигде не эмулируется через сложение с присваиванием. '+=' — это совершенно самостоятельный оператор. За такие трюки писателям компилятора надо бить по рукам. Хотя, пропертям, как известно, закон не писан...
Но почему?
Кто сказал, что упомянутая функциональность эмулируется через сложение с последующим присвоением?
С твоих слов я понял, что, присваивая к пропертям, использовать "+=" нельзя и всё тут — нельзя и хуч ты тресни. А вот почему нельзя — не понял. Поясни пожалуйста почему?
ЗЫ Може я не правильно понимаю слово проперти(property)? Под пропертёй я понимаю любую публичную(public) переменную класса, это верно?
Здравствуйте Lummox, Вы писали:
L>Здравствуйте Андрей Тарасевич, Вы писали:
L>Но почему? L>Кто сказал, что упомянутая функциональность эмулируется через сложение с последующим присвоением? L>С твоих слов я понял, что, присваивая к пропертям, использовать "+=" нельзя и всё тут — нельзя и хуч ты тресни. А вот почему нельзя — не понял. Поясни пожалуйста почему? L>ЗЫ Може я не правильно понимаю слово проперти(property)? Под пропертёй я понимаю любую публичную(public) переменную класса, это верно?
This attribute can be applied to non-static “virtual data members” in a class or structure definition. The compiler treats these “virtual data members” as data members by changing their references into function calls.
When the compiler sees a data member declared with this attribute on the right of a member-selection operator (“.” or “->“), it converts the operation to a get or put function, depending on whether such an expression is an l-value or an r-value. In more complicated contexts, such as “+=“, a rewrite is performed by doing both get and put.
This attribute can also be used in the declaration of an empty array in a class or structure definition. For example:
__declspec(property(get=GetX, put=PutX)) int x[];
The above statement indicates that x[] can be used with one or more array indices. In this case, i=p->x[a][b] will be turned into i=p->GetX(a, b), and p->x[a][b] = i will be turned into p->PutX(a, b, i);
Здравствуйте Lummox, Вы писали:
АТ>>Во-первых, замена '+=' на сложение с последующим присваиванием — это не впрямую.
АТ>>Во-вторых, в С++ функциональность оператора '+=' никогда и нигде не эмулируется через сложение с присваиванием. '+=' — это совершенно самостоятельный оператор. За такие трюки писателям компилятора надо бить по рукам. Хотя, пропертям, как известно, закон не писан... L> L>Но почему? L>Кто сказал, что упомянутая функциональность эмулируется через сложение с последующим присвоением?
А как еще? Операция '+=' не является просто сокращением для "чтения + увеличение + присваивание". Это совершенно самостоятельная операция, которая выполняет инкремент своего аргумента "на месте".
L>С твоих слов я понял, что, присваивая к пропертям, использовать "+=" нельзя и всё тут — нельзя и хуч ты тресни. А вот почему нельзя — не понял. Поясни пожалуйста почему?
L>ЗЫ Може я не правильно понимаю слово проперти(property)? Под пропертёй я понимаю любую публичную(public) переменную класса, это верно?
Вообще говоря, под проперти обычно понимается "мнимое" поле класса. Если у некоторого класса есть проперти 'a', то внешне работа с 'a' выглядит как работа с обычным полем класса. Но физически в классе такого поля нет, а все обращения к 'a' компилятор автоматически заменяет на вызов одной из двух функций — одна для чтения 'a' и одна для записи 'a'. Как я понимаю, именно о таких проперти шла речь здесь.
Единственная модифицирующая операция, которая определена для проперти — это присваивание. Оно превращается в вызов функции записи проперти. Никакие другие модифицирующие операции к проперти, по идее, применимы быть не должны. Только присваивание. Создателям компиляторов показалось, что неплохой идеей быдет выражение других модифицирующих операций (например '+=') через немодифицирующие операции (например, '+') и присваивание. Это плохая идея. В С++, если у некоторого объекта не операции '+=', то ее нельзя применить к этому объекту. Нигде и никогда в С++ операция '+=' не эмилируется компилятором через '+' и '='. С чего это вдруг для проперти должно делаться исключение?