| Другое > Hard'n'Soft |
| Програмирование на C++ |
| << < (10/25) > >> |
| Mr2:
--- Цитата: HoRRoR от 17 Март 2011, 16:57:17 ---P.S. Поменьше слушай Mr2, он часто глупости говорит. --- Конец цитаты --- Слушай HoRRoR'a и не подвергай его откровения сомнению, это истина в последней инстанции. :lol: --- Цитата: HoRRoR от 17 Март 2011, 16:57:17 ---А ещё плохо знаком с сабжем, раз осмеивает возможность присвоения объекту самому себе. --- Конец цитаты --- Разве я гдето говорил что я программист от Бога? :D Про присваение объекта самому себе говорю лишь в контексте данной программы. ;) |
| gepar:
Mr2,ну просто не использовать указатели и иже с ними(выделение памяти например, арифметику указателей) это тоже непрактично же и делает программу менее универсальной. Чтобы помнить что переменная является указателем Дейтел советует использовать в имени ptr, в этом случае обычно не забываешь что это указатель. |
| Mr2:
--- Цитата: gepar от 17 Март 2011, 17:16:53 ---Mr2,ну просто не использовать указатели и иже с ними(выделение памяти например, арифметику указателей) это тоже непрактично же и делает программу менее универсальной. --- Конец цитаты --- Ты писал про забытую ссылку(Ответ #175), вот я и говорю что нужно быть остарожнее и внимательнее. Особенно с указателями и выделением памяти. Если ты их используешь то должен держать их под контролем, а не забывать где ты выделил, где удалил, ссылается ли ссылка на существующий или на не существующий объект. Избежать лишних проблем можно не используя указатели там где без них можно обойдтись. Ну а если твоя программа что то теряет без них то отказываться конечно глупо. Плюс в том что можно избежать неприятных табличек. :D --- Цитата: gepar от 17 Март 2011, 17:16:53 ---Чтобы помнить что переменная является указателем Дейтел советует использовать в имени ptr, в этом случае обычно не забываешь что это указатель. --- Конец цитаты --- В winapi пишут перед именем указателя p. pHight. |
| gepar:
Делал программку для хранения дробей, кое-что из задуманного не получилось - не получается вывести в поток конструкцию вида (a+b), но при этом я могу сделать c=a+b, где a, b и c - объекты одного класса. --- Код: ---# include <iostream> # include <iomanip> using namespace std; class RationalNumber { friend ostream &operator<<(ostream &output, RationalNumber &abc); public: // констркутор по умолчанию, проверяет что дробная часть >0 // +проверяет можно ли сократить дробь RationalNumber(int a=1, int b=1) { nominator=(a>0) ? a:1; denominator=(b>0)? b:1; for (int i=2;i<=nominator;i++) if (denominator%i==0 && nominator%i==0 ) { nominator/=i; denominator/=i; } } // возможность сложения двух объектов класса RationalNumber RationalNumber operator+(RationalNumber &right) { if (denominator==right.denominator) //если знаменатели равны return RationalNumber(nominator+right.nominator,denominator); int temp; //иначе temp=denominator*right.denominator; // определяем новый знаменатель return RationalNumber(((temp/denominator*nominator)+(temp/right.denominator*right.nominator)) ,temp); } RationalNumber operator-(RationalNumber &right) { if (denominator==right.denominator) //если знаменатели равны return RationalNumber(nominator-right.nominator,denominator); int temp; //иначе temp=denominator*right.denominator; // определяем новый знаменатель return RationalNumber((temp/denominator)*nominator, (temp/right.denominator)*right.nominator); } private: int nominator; // числитель int denominator; // знаменатель }; ostream &operator<<(ostream &output, RationalNumber &abc) { output<<abc.nominator; if (abc.denominator>1) //если знаменатель не =1 (число не целое) output<<"/"<<abc.denominator<<endl; return output; } int main() { RationalNumber a(17,10); RationalNumber b(20,10); RationalNumber c; cout<<"A: "<<a; cout<<"B: "<<b<<endl; cout<<(c=a+b); // МОЖНО cout<<(a+b); // НЕЛЬЗЯ } --- Конец кода --- |
| HoRRoR:
Добавь волшебное слово const перед RationalNumber &abc при перегрузке оператора вывода в поток. |
| gepar:
HoRRoR, волшебник :) Раскрой фокус ostream &operator<<(ostream &output, const RationalNumber &abc) тут ведь получается что я запрещаю редактирование данных что я передаю в поток и это никак не связано же с возвращаемыми данными. |
| HoRRoR:
Я сам толком не знаю (точнее - не помню, потому как этому меня обучали) всех тонкостей, но это связано с созданием временного объекта. Я так понимаю, получить неконстантную ссылку извне на него нельзя. Либо передавать временный объект по значению, т.е. с созданием ещё одного временного объекта, либо передавать константной ссылкой. |
| gepar:
HoRRoR,ага, если передавать копию то тоже получилось скомпилировать. Добавлено позже: Тут мне написали мол в vs компилируется нормально мой код и с той магической const при перегрузке оператора вывода и без неё да только как заставить vs2010 компилировать код, когда у него на любой мой код одна ошибка: --- Код: ---1>Построение начато 18.03.2011 12:02:40. 1>InitializeBuildStatus: 1> Обращение к "Debug\New2.unsuccessfulbuild". 1>ClCompile: 1> New2.cpp 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(15): error C2143: синтаксическая ошибка: отсутствие ";" перед "'template<'" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(15): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(18): error C2143: синтаксическая ошибка: отсутствие "," перед "<" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(860): см. ссылку на создание экземпляров класса шаблон при компиляции "basic_istream<_Elem,_Traits>" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(22): error C2143: синтаксическая ошибка: отсутствие ";" перед "<" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(22): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(22): error C2238: непредвиденные лексемы перед ";" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(23): error C2143: синтаксическая ошибка: отсутствие ";" перед "<" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(23): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(23): error C2238: непредвиденные лексемы перед ";" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(24): error C2143: синтаксическая ошибка: отсутствие ";" перед "<" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(24): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(24): error C2238: непредвиденные лексемы перед ";" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(25): error C2143: синтаксическая ошибка: отсутствие ";" перед "<" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(25): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(25): error C2238: непредвиденные лексемы перед ";" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(26): error C2143: синтаксическая ошибка: отсутствие ";" перед "<" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(26): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(26): error C2238: непредвиденные лексемы перед ";" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(29): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "basic_istream" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(29): error C2071: basic_istream<_Elem,_Traits>::__CLR_OR_THIS_CALL: недопустимый класс хранения 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(29): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(29): error C2061: синтаксическая ошибка: идентификатор "_Mysb" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(37): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "basic_istream" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(37): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(37): error C2473: _Uninitialized: выглядит как определение функции, но без списка параметров. 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(39): error C2653: ios_base: не является именем класса или пространства имен 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(39): error C2059: синтаксическая ошибка: this 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(39): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(39): warning C4183: _Addstd: отсутствие возвращаемого типа; предполагается функция-член, возвращающая "int" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(42): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "__CLR_OR_THIS_CALL" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(923): error C2143: синтаксическая ошибка: отсутствие "," перед "<" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(965): см. ссылку на создание экземпляров класса шаблон при компиляции "basic_iostream<_Elem,_Traits>" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(928): error C2143: синтаксическая ошибка: отсутствие ";" перед "<" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(928): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(928): error C2238: непредвиденные лексемы перед ";" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(929): error C2059: синтаксическая ошибка: < 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(929): error C2238: непредвиденные лексемы перед ";" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(936): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "basic_iostream" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(936): error C2071: basic_iostream<_Elem,_Traits>::__CLR_OR_THIS_CALL: недопустимый класс хранения 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(936): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(936): error C2143: синтаксическая ошибка: отсутствие ")" перед "<" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(936): error C2143: синтаксическая ошибка: отсутствие ";" перед "<" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(936): error C2059: синтаксическая ошибка: ) 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(936): error C2334: непредвиденные лексемы перед ":"; пропуск вероятного тела функции 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(942): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "basic_iostream" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(942): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(950): error C2143: синтаксическая ошибка: отсутствие ";" перед "=" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(951): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(956): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "swap" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(956): error C2182: __CLR_OR_THIS_CALL: недопустимое использование типа "void" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(956): error C2040: basic_iostream<_Elem,_Traits>::__CLR_OR_THIS_CALL: "int" отличается по уровням косвенного обращения от "basic_iostream<_Elem,_Traits> &" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(957): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(960): warning C4183: swap: отсутствие возвращаемого типа; предполагается функция-член, возвращающая "int" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(962): error C2143: синтаксическая ошибка: отсутствие ";" перед "~" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(962): error C2433: basic_iostream<_Elem,_Traits>::__CLR_OR_THIS_CALL: "virtual" не разрешается для объявлений данных 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(962): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1137): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "ws" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1137): error C2433: __CLRCALL_OR_CDECL: "inline" не разрешается для объявлений данных 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1137): error C2530: __CLRCALL_OR_CDECL: ссылки должны быть инициализированы 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1137): error C2065: _Elem: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1137): error C2065: _Traits: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1170): error C2065: char_traits: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1170): error C2062: тип "char" не требуется 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1171): error C2065: char_traits: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1171): error C2062: тип "char" не требуется 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1171): error C2059: синтаксическая ошибка: ) 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1172): error C2143: синтаксическая ошибка: отсутствие ";" перед "{" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1177): error C2143: синтаксическая ошибка: отсутствие ";" перед "{" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1178): error C2653: ios_base: не является именем класса или пространства имен 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1178): error C2653: ios_base: не является именем класса или пространства имен 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1179): error C2065: _Elem: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1179): error C2065: _Traits: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1179): error C2039: sentry: не является членом "basic_istream" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(18): см. объявление "basic_istream" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1182): error C2143: синтаксическая ошибка: отсутствие ";" перед "{" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1184): error C2065: ctype: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1184): error C2065: _Elem: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1184): error C2059: синтаксическая ошибка: ) 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1187): error C2653: _Traits: не является именем класса или пространства имен 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1187): error C2143: синтаксическая ошибка: отсутствие ")" перед ";" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1188): error C2059: синтаксическая ошибка: ) 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1189): error C2653: _Traits: не является именем класса или пространства имен 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1189): error C2653: _Traits: не является именем класса или пространства имен 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1189): error C2065: _Meta: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1190): error C2143: синтаксическая ошибка: отсутствие ";" перед "{" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1191): error C2653: ios_base: не является именем класса или пространства имен 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1193): error C2143: синтаксическая ошибка: отсутствие ";" перед "}" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1194): error C2039: space: не является членом "`global namespace'" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1195): error C2653: _Traits: не является именем класса или пространства имен 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1195): error C2065: _Meta: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1195): error C3861: to_char_type: идентификатор не найден 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1195): error C2143: синтаксическая ошибка: отсутствие "," перед ")" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1198): error C2143: синтаксическая ошибка: отсутствие ";" перед "}" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1201): error C2143: синтаксическая ошибка: отсутствие ";" перед "}" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1203): error C2143: синтаксическая ошибка: отсутствие ";" перед "}" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1205): error C2065: char_traits: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1205): error C2062: тип "wchar_t" не требуется 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1206): error C2065: char_traits: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1206): error C2062: тип "wchar_t" не требуется 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1206): error C2059: синтаксическая ошибка: ) 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1207): error C2143: синтаксическая ошибка: отсутствие ";" перед "{" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1212): error C2143: синтаксическая ошибка: отсутствие ";" перед "{" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1213): error C2653: ios_base: не является именем класса или пространства имен 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1213): error C2653: ios_base: не является именем класса или пространства имен 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1214): error C2065: _Elem: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1214): error C2065: _Traits: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1214): error C2039: sentry: не является членом "basic_istream" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(18): см. объявление "basic_istream" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1217): error C2143: синтаксическая ошибка: отсутствие ";" перед "{" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1219): error C2065: ctype: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1219): error C2065: _Elem: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1219): error C2059: синтаксическая ошибка: ) 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1222): error C2653: _Traits: не является именем класса или пространства имен 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1222): error C2143: синтаксическая ошибка: отсутствие ")" перед ";" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1223): error C2059: синтаксическая ошибка: ) 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1224): error C2653: _Traits: не является именем класса или пространства имен 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1224): error C2653: _Traits: не является именем класса или пространства имен 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1224): error C2065: _Meta: необъявленный идентификатор 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1225): error C2143: синтаксическая ошибка: отсутствие ";" перед "{" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1226): error C2653: ios_base: не является именем класса или пространства имен 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1228): error C2143: синтаксическая ошибка: отсутствие ";" перед "}" 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(1228): fatal error C1003: число ошибок превышает 100; остановка компиляции 1> 1>СБОЙ построения. 1> 1>Затраченное время: 00:00:01.38 ========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ========== --- Конец кода --- |
| HoRRoR:
У меня в 2008-й студии компилируется. Менял что-нибудь? Наверняка в коде какой-нибудь лишний символ или наоборот - забыл что-то закрыть. Вообще, надо бы по поводу временных объектов и ссылок почитать спецификацию, мне аж интересно стало... По идее, менять временный объект по ссылке ничего не запрещает, но M$ придерживается спецификаций меньше, чем GNU. Так что я прям озадачен. P.S. Мой тебе совет - не используй русифицированные средства разработки. |
| gepar:
HoRRoR,думаешь в этом дело? Ато я сейчас и Hello World попробовал скомпилировать и все те же самые ошибки, попробую ка я скачать англ. версию этой vs2010, я ведь русскую качал ещё когда только hello world думал чем бы откомпилировать. Думал там и правда польза с неё будет и с её хелпа, а на деле пользы 0 от русского интерфейса. |
| HoRRoR:
Ну тогда вряд ли в этом... Ставь английскую версию, а файлы справки попробуй потом отдельно поставить с русифицированного пакета. А то переводу интерфейса даже промт позавидует, не говоря уже о возникающих косяках... Хотя, может ставить русскую справку на английскую версию - заведомо глупая идея. Вот что говорит википедия: --- Цитата ---параметры ссылки, не помеченные const, могут только быть адресуемыми значениями: --- Конец цитаты --- Это вполне очевидно. Теперь вопрос в том, в каких случаях временные объекты являются адресуемыми значениями. Если помечать как const, то само собой, что можно передавать и константы непосредственно, но вот является ли создаваемый временный объект константным? Физически-то объект есть, и он не константа... |
| gepar:
Встретился с директивой define и возник вопрос : а вот зачем она? Она ведь по сути представляет собой обычную глобальную переменную /функцию. Не проще ли просто в начале программы написать без define эту const переменную/функцию. Или она как-то по особенному работает (быстрее или ещё что)? Ответьте в двух словах пожалуйста, в инете я уже посмотрел как ею пользоваться. Хотя вот выгуглил ещё что define эта создаёт макроконстанту, но мне не понятно что значит это слово, ну не маленькая же константа :) |
| Mr2:
--- Цитата: gepar от 18 Март 2011, 21:58:13 ---Хотя вот выгуглил ещё что define эта создаёт макроконстанту, но мне не понятно что значит это слово, ну не маленькая же константа :) --- Конец цитаты --- Помоему это пережитки прошлого.В "C" небыло "const". Макро подстановка значит что везде где встретится ONE(#define ONE 1) компилятор подставит 1. result = ONE. Также можно создавать inline функуии. |
| gepar:
Mr2,ну то что подставит то ясно, но какое отличие #define a 1 от той же const a(1) написанной в начале программы? |
| Mr2:
--- Цитата: gepar от 18 Март 2011, 22:17:09 ---Mr2,ну то что подставит то ясно, но какое отличие #define a 1 от той же const a(1) написанной в начале программы? --- Конец цитаты --- Видимо в "C" небыло "const" и "inline" по этому использовали #define. Это надо уточнить у того кто на "C" пишет. АгА, всё верно. --- Цитата ---These are new in Standard C, although the idea of const has been borrowed from C++. Let us get one thing straight: the concepts of const and volatile are completely independent. A common misconception is to imagine that somehow const is the opposite of volatile and vice versa. They are unrelated and you should remember the fact. Источник. --- Конец цитаты --- |
| HoRRoR:
Вы в корне неверно понимаете предназначение define. Это уровень препроцессора - т.е. эти директивы выполняются ещё до компиляции. Например: --- Код: ---#if defined(ABC) int abc = 1; #else cout << "error: not supported!" << endl; #endif #if ABC==1 ... #else ... #endif --- Конец кода --- Если ABC объявлено через define, то будет компилироваться первый кусок кода, если нет - то второй. Далее должно быть понятно. Далее - define по сути создаёт мнемонику. Написав #define x y вы будете получать подстановку y вместо x. Ещё - через define можно объявлять макросы. --- Код: ---#define foo(x,y) (x+y*y-100) cout << foo(10, 20) << endl; --- Конец кода --- И инлайн-функции и макросы - разные понятия, хоть и схожи по предназначению. В макросах можно что угодно задать, вплоть до упрощённого синтаксиса описания данных. В общем, спектр применения define очень широк. А в качестве констант его можно использовать при конфигурации проекта. Например: --- Код: ---#ifdef WINDOWS # define X 100 #else # define X 200 #endif --- Конец кода --- |
| Mr2:
HoRRoR, а соль то в чём? :? Что полезного во всех этих заморочках? Вот в чём вопрос. То что можно это понятно, но нужно ли? В каких ситуациях? |
| HoRRoR:
Да без этого, в общем-то, не обойтись там, где нужна условная компиляция. При наличии нескольких конфигураций проекта, при настройке проекта через заголовочные файлы, при необходимости сделать код более лаконичным засчёт макросов и т.п., да и вообще при необходимости условной компиляции и прочего. Например, грубый пример - у тебя есть проект в двух конфигурациях, для windows и для linux. У тебя есть два заголовочных файла для двух этих конфигураций - c_windows.h и c_linux.h. Делаешь так: --- Код: ---#if defined(_WINDOWS_) # include "c_windows.h" #elif defined(_LINUX_) # include "c_linux.h" #else # error "Not configured!" #endif --- Конец кода --- Или у тебя две конфигурации проекта для двух разных устройств с разным фиксированным разрешением экрана. Делаешь так: --- Код: ---#if defined(FIRST_DEVICE) # define SCREEN_W 1024 # define SCREEN_H 768 #else # define SCREEN_W 640 # define SCREEN_H 480 #endif int main() { Color *screen_buf = new Color32[SCREEN_W * SCREEN_H]; ... delete []screen_buf; return 0; } --- Конец кода --- |
| Mr2:
Понятно. То есть эффективность в основном в условной компиляции. :) |
| gepar:
HoRRoR,спасибо за лекцию :) Ато что-то я в преподше моей по с++ разочаровался, я же до этого лабы читал лишь задания (кроме структур), а тут вот и теорию что она даёт перед заданиями по классах почитал ... в общем тихий ужас, сразу видно что те примеры что она писала она не компилировала(часто действия пропущены и только догадываешься чего не хватает + без 4 как min правок ни один пример не откомпилировать) ... а деструкторы которые ничего не делают, а только существуют ... а выделение памяти через maloc, а удаление через delete (хотя это я уже придираюсь) ... а то что нигде нет указанного пространства имён ... это хорошо что я с Дейтела начал, по тем конспектам преподши поди пойми что-то. |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |