Другое > 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 (хотя это я уже придираюсь) ... а то что нигде нет указанного пространства имён ... это хорошо что я с Дейтела начал, по тем конспектам преподши поди пойми что-то.
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии