Автор Тема: Програмирование на C++  (Прочитано 76697 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #150 : 08 Март 2011, 14:08:32 »
HoRRoR,ну я считал что для перегрузки операции нужно чтобы она производилась по значению (те потому и &). Хотя я наверное мрачно объяснил что я хотел написать, ну да ладно, упустим это.
Цитата: HoRRoR
int* - тип, звёздочка относится к инту. int& - то же самое.
Я пока что не знаю что это такое и что так вообще можно  :) Ну и вообще раздел по перегрузке операторов Дейтела я ещё не дочитал, то была проба пера.

Добавлено позже:
Встречный вопрос: а как же задать тип int*, компилятор же всегда думает что это указатель и что * относится к имени переменной следующей после int (например int* abc).

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1594
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #151 : 12 Март 2011, 11:26:56 »
Вопрос номер n+1: А как-то можно ограничить ввод? Только не по количеству символов, а чтобы когда я ожидаю что будет введено число то символы не вводились и наоборот? В многих приложениях я встречал что когда пытаешься ввести в поле для цифр символы то ввод не происходит, правда эти приложения не являлись консольными так что не знаю можно ли сделать что-то подобное здесь.
//input check 12.03.2011

#include <iostream>

using namespace std;

int main(){
 int input = 0;
 for(int i = 0; i < 10;++i){
   cout << endl;
   cout << "      Enter number: ";
   cin >> input;
   cout << endl;
   if(cin.fail()){ //если состояние входного потока ошибочное.
     cin.clear(); //сбросить поток...
     string garbage;
     getline(cin, garbage); //... и пропустить всю строку.
     cout << "  This is not a number!!! " <<endl;
     }    
   else
   cout << "       You enter: " << input <<endl;
  }  
 system("pause");
}
Вот нашёл сегодня. :)

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #152 : 12 Март 2011, 12:45:26 »
Mr2,во, круто! Попробую сегодня что-то написать маленькое с использованием этой проверки cin.fail.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #153 : 12 Март 2011, 13:31:41 »
Цитата
Встречный вопрос: а как же задать тип int*, компилятор же всегда думает что это указатель и что * относится к имени переменной следующей после int (например int* abc).
What? int* или int *a или int *a, *b - чем не ответ на твой вопрос? На крайний случай - typedef или define.

Цитата
Вот нашёл сегодня.
Нажимаю, к примеру, f - вводится f. В чём соль, если речь шла об ограничении ввода, а не о проверке? Т.е. жму f - f не вводится и в консоли не появляется, жму 4 - 4 вводится.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #154 : 12 Март 2011, 14:46:06 »
HoRRoR,ну да это не совсем то чего хотелось изначально, но это хоть что-то. Да в этом случае вводиться всё равно будет всё подряд, но будет хотя-бы проверка что данные соответствуют типу и "не совместимые" данные не будут сохраняться в переменную  :)

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1594
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #155 : 12 Март 2011, 16:45:08 »
HoRRoR,ну да это не совсем то чего хотелось изначально, но это хоть что-то. Да в этом случае вводиться всё равно будет всё подряд, но будет хотя-бы проверка что данные соответствуют типу и "не совместимые" данные не будут сохраняться в переменную  :)
Молодец! :) Правильно!

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #156 : 13 Март 2011, 03:02:55 »
Работает слегка непонятно, например я ввожу 121212abc23423
тоесть в  input у меня должны быть неправильные данные (они ведь подряд записаны). Но при этом я сначала почему-то получаю выполнение того что по else (программа пишет что я ввёл 121212 (всё что до abc)) и потом тут же выполняется то что в if(cin.fail()) и пишет мол были введены не числа. Почему так?
Кстати проверка идёт потока ,а не содержимого int переменной в которую был ввод из потока. Это что значит что поток "помнит" последние вводимые данные или я тут тоже что-то не так понял? Подскажите пожалуйста.

Добавлено позже:
Нашёл очередной способ вывода русского текста, этот совсем короткий - всего одна строчка:
setlocale(LC_ALL, "Russian");

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1594
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #157 : 13 Март 2011, 10:52:45 »
Работает слегка непонятно, например я ввожу 121212abc23423
тоесть в  input у меня должны быть неправильные данные (они ведь подряд записаны). Но при этом я сначала почему-то получаю выполнение того что по else (программа пишет что я ввёл 121212 (всё что до abc)) и потом тут же выполняется то что в if(cin.fail()) и пишет мол были введены не числа. Почему так?

 В подробности потоков пока не вникал. Видимо поток действительно всё помнит.
 Не с проста нужно пропускать строку.(getline(cin, garbage); //... и пропустить всю строку.)
 Но странно что продолжается  вывод игнорируя ввод пользователя.(cin >> input; :?)
Кстати проверка идёт потока ,а не содержимого int переменной в которую был ввод из потока. Это что значит что поток "помнит" последние вводимые данные или я тут тоже что-то не так понял? Подскажите пожалуйста.
Тут главное что гарантируется что в int будет введено число а не символ. А уж какие значения допустимы решает сам программист.

Подправил вывод. :)
//input check 13.03.2011

#include <iostream>

using namespace std;

int main(){
 int input = 0;
 for(int i = 0; i < 10;++i){
   cout << endl;
   cout << "      Enter number: ";
   cin >> input;
   cout << endl;
   if(cin.fail()){ //если состояние входного потока ошибочное.
     cin.clear(); //сбросить поток...
     cin.ignore();
     //string garbage;
     //getline(cin, garbage); //... и пропустить всю строку.
     cout << "  This is not a number!!! " <<endl;
     }   
   else
   cout << "       You enter: " << input <<endl;
   string garbage;
   getline(cin, garbage); //... и пропустить всю строку.
  }   
 system("pause");
}

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #158 : 16 Март 2011, 23:41:57 »
Пытаюсь тут сделать свой двухмерный массив с обращением к элементам как в паскале (1,2) вместо [1] [2].
Да только чего-то мой конструктор копии рушит работу всей программы, притом даже если я его не использую, а только он присутствует в коде то тут же отваливается возможность проверки на равенство двух объектов классов o_0
# include <iostream>
# include <iomanip>
using namespace std;

class Array
{
public:
    //конструктор по умолчанию
    Array(int a, int b)
    {
        row=(a>0) ? a:1;
        column=(b>0)? b:1;
        ptr= new int [row*column+1];
        for (int i=0;i<row*column+1;i++)
         ptr[i]=0;
    }

    //конструктор копии который не работает
    Array (const Array &abc)
    {
        if (*this!=abc);
        {
            if (row!=abc.row || column!=abc.column)
            {
                delete []ptr;
                row=abc.row;
                column=abc.column;
                ptr=new int[row*column+1];
            }
            for (int i=0;i<row*column+1;i++)
             ptr[i]=abc.ptr[i];
        }
    }

    //возможность обращения к нужному элементу массива
    int &operator()(int a, int b)
    {
        if ((a>0) && (a<=row) &&(b>0) && (b<=column))
         if (a==1)
          return ptr[a+b];
         else
          return ptr[(a-1)*column+b];
        else
         exit(100500);
    }

    //возможность обращения к нужному элементу массива для const объекта класса
    int &operator()(int a, int b) const
    {
        if ((a>0) && (a<=row) &&(b>0) && (b<=column))
         if (a==1)
          return ptr[a+b];
         else
          return ptr[(a-1)*column+b];
        else
         exit(100500);
    }

    //проверка на равенство
    bool operator==(Array test)
    {
        if ((row!=test.row) || (column!=test.column))
         return false;
        for (int j=0;j<row*column+1;j++)
         if (ptr[j]!=test.ptr[j])
          return false;
        return true;
    }

    //проверка на неравенство
    bool operator !=(Array test)
    {
        return !(*this==test);

    }



private:
    int row; //колличество строк
    int column; //колличество столбцов
    int *ptr; //указатель на массив с элементами int
};


int main()
{
    Array a(5,5);
    Array b(5,5);
    cout<<boolalpha<<(a!=b);//без попытки их сравнить программа
                            //в процессе работы ошибку возвращать не будет
    return 0;
}



Добавлено позже:
Тааак, в общем-то я напортачил с проверкой вначале не делаем ли мы самоприсваивание, уже понятно, осталось это исправить  :)

Добавлено позже:
да только чего-то не получается, как бы её грамотно устроить?

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1594
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #159 : 17 Март 2011, 00:24:07 »
Пытаюсь тут сделать свой двухмерный массив с обращением к элементам как в паскале (1,2) вместо [1] [2].
Фигнёй ты страдаешь. :)
 Не вникал в твои усовершенствования матрицы, но так делать незя. :D
if (*this!=abc);

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #160 : 17 Март 2011, 00:34:02 »
Но как сделать проверку что это не самоприсваивание, больше вникать никуда не надо, мне нужно лишь проверить что объект класса не присваивается самому себе, всё остальное работает.

Остальное кстати вот:
# include <iostream>
# include <iomanip>
using namespace std;

class Array
{
friend ostream &operator<<(ostream &output, Array &test);
friend ostream &operator>>(ostream &output, Array &test);
public:
    //конструктор по умолчанию
    Array(int a, int b)
    {
        row=(a>0) ? a:1;
        column=(b>0)? b:1;
        ptr= new int [row*column+1];
        for (int i=1;i<row*column+1;i++)
         ptr[i]=0;
    }

    //конструктор копии в который я не могу добавить проверку на самоприсваивание
    Array (const Array &abc)
    {
            if (row!=abc.row || column!=abc.column)
            {
                delete []ptr;
                row=abc.row;
                column=abc.column;
                ptr=new int[row*column+1];
            }
            for (int i=0;i<row*column+1;i++)
             ptr[i]=abc.ptr[i];
    }

    //возможность обращения к нужному элементу массива
    int &operator()(int a, int b)
    {
        if ((a>0) && (a<=row) &&(b>0) && (b<=column))
         if (a==1)
          return ptr[a+b];
         else
          return ptr[(a-1)*column+b];
        else
         exit(100500);
    }

    //возможность обращения к нужному элементу массива для const объекта класса
    int &operator()(int a, int b) const
    {
        if ((a>0) && (a<=row) &&(b>0) && (b<=column))
         if (a==1)
          return ptr[a+b];
         else
          return ptr[(a-1)*column+b];
        else
         exit(100500);
    }

    //проверка на равенство
    bool operator==(Array test)
    {
        if ((row!=test.row) || (column!=test.column))
         return false;
        for (int j=0;j<row*column+1;j++)
         if (ptr[j]!=test.ptr[j])
          return false;
        return true;
    }

    //проверка на неравенство
    bool operator !=(Array test)
    {
        return !(*this==test);

    }



private:
    int row; //колличество строк
    int column; //колличество столбцов
    int *ptr; //указатель на массив с элементами int
};

ostream &operator<<(ostream &output, Array &test)
{
    output<<endl;
    for (int i=1;i<((test.row*test.column)+1);i++)
    {
        output<<setw(3)<<test.ptr[i]<<" ";
        if ((i)%test.column==0)
         output<<endl;
    }
    return output;
}

ostream &operator>>(ostream &output, Array &test)
{
    output<<endl;
    for (int i=1;i<((test.row*test.column)+1);i++)
     output<<setw(3)<<test.ptr[i]<<" ";
    output<<endl;
    return output;
}


int main()
{
    Array a(2,3);
    a(1,1)=3;
    a(2,2)=5;
    Array b(5,5);
    b(1,4)=10;
    b(3,3)=20;
    cout<<"a=b ? : "<<boolalpha<<(a!=b);
    cout<<"\nA:"<<a<<"B:"<<b;
    return 0;
}

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1594
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #161 : 17 Март 2011, 00:37:52 »
gepar,
Ты понял почему писать if (*this!=abc); нельзя?

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #162 : 17 Март 2011, 00:48:52 »
Mr2,нет, я только понял что нельзя  :)

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1594
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #163 : 17 Март 2011, 00:55:59 »
Mr2,нет, я только понял что нельзя  :)
if можно писать двумя способами:
------------1-------------------
if(a!=b)
 cout << а <<endl;
------------2-----------------------
if(a!=b){
 cout << а <<endl;
 cout << а <<endl;
}
-------------------------------------
--------фатал эррор :D-------------
if(a!=b);
 cout << а <<endl;
-------------------------------------
 

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #164 : 17 Март 2011, 01:07:30 »
Mr2, а , ты об этом, я уже убирал ;, там не в ней дело, вот смотри:
//свой класс-массив
//+ возможность получать min или max элемент массива
# include <iostream>
# include <iomanip>
# include <cstring>
using namespace std;

class Array
{
friend ostream &operator<<(ostream &output, Array &test);
friend ostream &operator>>(ostream &output, Array &test);
public:
    //конструктор по умолчанию
    Array(int a, int b)
    {
        row=(a>0) ? a:1;
        column=(b>0)? b:1;
        ptr= new int [row*column+1];
        for (int i=1;i<row*column+1;i++)
         ptr[i]=0;
    }

    //конструктор копии который не работает
    Array (const Array &abc)
    {
        if (*this!=abc)
        {
            if (row!=abc.row || column!=abc.column)
            {
                delete []ptr;
                row=abc.row;
                column=abc.column;
                ptr=new int[row*column+1];
            }
            for (int i=0;i<row*column+1;i++)
             ptr[i]=abc.ptr[i];
        }
        else exit(1);
    }

    //возможность обращения к нужному элементу массива
    int &operator()(int a, int b)
    {
        if ((a>0) && (a<=row) &&(b>0) && (b<=column))
         if (a==1)
          return ptr[a+b];
         else
          return ptr[(a-1)*column+b];
        else
         exit(100500);
    }

    //возможность обращения к нужному элементу массива для const объекта класса
    int &operator()(int a, int b) const
    {
        if ((a>0) && (a<=row) &&(b>0) && (b<=column))
         if (a==1)
          return ptr[a+b];
         else
          return ptr[(a-1)*column+b];
        else
         exit(100500);
    }

    //возможность нахождения min/max элемента
    int &operator()(string a)
    {
        if (a=="maximum")
        {
            int *max=&ptr[1];
            for (int i=1;i<row*column+1;i++)
             if (ptr[i]>*max)
              max=&ptr[i];
            return *max;
        }

        else if (a=="minimum")
        {
            int *min=&ptr[1];
            for (int i=1;i<row*column+1;i++)
             if(ptr[i]<*min)
              min=&ptr[i];
            return *min;
        }
        exit (1);
    }

    //проверка на равенство
    bool operator==(Array test)
    {
        if ((row!=test.row) || (column!=test.column))
         return false;
        for (int j=0;j<row*column+1;j++)
         if (ptr[j]!=test.ptr[j])
          return false;
        return true;
    }

    //проверка на неравенство
    bool operator !=(Array test)
    {
        return !(*this==test);

    }



private:
    int row; //колличество строк
    int column; //колличество столбцов
    int *ptr; //указатель на массив с элементами int
};

ostream &operator<<(ostream &output, Array &test)
{
    output<<endl;
    for (int i=1;i<((test.row*test.column)+1);i++)
    {
        output<<setw(3)<<test.ptr[i]<<" ";
        if ((i)%test.column==0)
         output<<endl;
    }
    return output;
}

ostream &operator>>(ostream &output, Array &test)
{
    output<<endl;
    for (int i=1;i<((test.row*test.column)+1);i++)
     output<<setw(3)<<test.ptr[i]<<" ";
    output<<endl;
    return output;
}


int main()
{
    Array a(2,3);
    a(1,1)=3;
    a(2,2)=5;
    Array b(5,5);
    b(1,4)=10;
    b(3,3)=20;
    cout<<"a=b ? : "<<boolalpha<<(a==b);
    cout<<"\nA:"<<a<<"B:"<<b;
    cout<<b("maximum");
    return 0;
}


Добавлено позже:
+ мне по прежнему интересно почему будет крешится программа с этой неправильной проверкой в конструкторе если в main он (констркутор копии) использоваться НЕбудет, но будет использоваться сравнение (== или !=). Вот сам попробуй убрать строку в main где используется сравнение и программа скомпилируется и будет работать нормально, но где же связь? Операции сравнения у меня никак не используют конструктор копии же.

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1594
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #165 : 17 Март 2011, 01:18:37 »
Я не понимаю твой код. :(
Ты опиши проблему я мож чего найду.
Цитата
//конструктор копии в который я не могу добавить проверку на самоприсваивание
Непонятно в каком случае происходит самокопирование?
Я читал что может быть неверное копирование связаное с адресами, а про само копирование не в курсе.
Пойду вникать в тонкости конструктора копирования. ;)
« Последнее редактирование: 17 Март 2011, 01:21:02 от Mr2 »

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #166 : 17 Март 2011, 09:43:03 »
row*column+1 - зачем +1? Количество элементов матрицы NxM и равно NxM.
Непонятно, как ты используешь exit() без cstdlib.
if (*this!=abc)
Ай-яй-яй, не делают так. К тому же, у тебя оператор сравнения перегружен. Сравнивают адреса:
if (this!=&abc)

Чуть ниже:
delete []ptr;
А что ты, собственно, удаляешь? Ты разве выделял память под этот ptr? Нафиг эту строку.
И вообще, замени
bool operator==(Array test)
bool operator!=(Array test)
на
bool operator==(const Array& test)
bool operator!=(const Array& test)
Негоже каждый раз для сравнения создавать копию массива.

        if (a=="maximum")
...
        else if (a=="minimum")
Ну кто так делает? Это верх нерациональности. Заведи консанты или enum - {A_MAX, A_MIN}, принимай int или переменную типа этого enum'а, а там уже сравнивай или через switch выполняй необходимые действия.

Остальной код не смотрел, на этом всё заработало, дальше уж сам ищи ляпы.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #167 : 17 Март 2011, 11:48:34 »
Цитата: HoRRoR
row*column+1 - зачем +1? Количество элементов матрицы NxM и равно NxM.
да это я чтобы пропустить элемент 0.
Цитата: HoRRoR
Непонятно, как ты используешь exit() без cstdlib.
Компилируется так - я и не использую  :)
Цитата: HoRRoR
Ай-яй-яй, не делают так. К тому же, у тебя оператор сравнения перегружен. Сравнивают адреса:
Понял, буду знать.
Цитата: HoRRoR
А что ты, собственно, удаляешь? Ты разве выделял память под этот ptr? Нафиг эту строку.
Ну а если у меня сначала было Array a(5,5) .... а потом уже a=b, следовательно место под a изначально было же выделено.
По поводу того чтобы не копировались мои массивы для сравнения исправлю, спасибо за подсказку.
Цитата: HoRRoR
Ну кто так делает? Это верх нерациональности. Заведи консанты или enum - {A_MAX, A_MIN}, принимай int или переменную типа этого enum'а, а там уже сравнивай или через switch выполняй необходимые действия.
Не читал я ещё о enum, посмотрю что он из себя представляет. Через switch идея была сделать.
Ну и спасибо за конструктивную критику  :)

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1594
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #168 : 17 Март 2011, 13:25:35 »
gepar,
А что ты хотел проверить в if (*this!=abc)?
Совпадают ли адрес нового(this) объекта с существующим(abc)?
 Вот нормальный массив:
//Безопастный целочисленный массив.
//Автор Г. Шилдт.
#include <iostream>
#include <new>
#include <cstdlib>

using namespace std;

class array{
  int *p;
  int size;
 public:
  array(int cz){
   try{
    p = new int[cz];
    }
   catch(bad_alloc xa){
    cout << "error constr\n";
    exit(EXIT_FAILURE);
     }
    size = cz;
    }
  ~array(){
   delete[] p;
    }
  array(const array &a);
  void put(int i, int j){
   if(i>=0 && i<size) p[i] =j;
    }
  int get(int i){
   return p[i];
  }
};

array::array(const array &a){
 int i;
 try{
  p = new int[a.size];
   }
 catch(bad_alloc xa){
  cout << "Copy constr error\n";
  exit(EXIT_FAILURE);
   }
  for(i=0; i<a.size;i++)
   p[i] = a.p[i];
}

int main(){
 array num(10);
 int i;
 for(i = 0; i<10; i++)
  num.put(i,i);
 for(i=9; i>=0; i--)
  cout << num.get(i);
  cout << "\n";
 array x(num); //включаем копирующий конструктор.
 for(i=0; i<10; i++)
  cout<< x.get(i);
 cout <<"\n";
 system("pause");
 return 0;
}


« Последнее редактирование: 17 Март 2011, 14:41:03 от Mr2 »

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #169 : 17 Март 2011, 15:36:38 »
Mr2,да, я хотел проверить не будет ли самокопирование, которое может привести к ошибкам в некоторых случаях, ну да HoRRoR уже написал что нужно было адрес сравнивать, сейчас попробую поисправлять все те ошибки что я допустил.

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1594
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #170 : 17 Март 2011, 16:05:36 »
Цитата: gepar
Mr2,да, я хотел проверить не будет ли самокопирование,
В каком случае будет самокопирование? :?
array a;
    a=a;
ты об этом?
 
« Последнее редактирование: 17 Март 2011, 16:10:33 от Mr2 »

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #171 : 17 Март 2011, 16:08:17 »
Mr2,
array a;
a=a ну или a(a).

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1594
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #172 : 17 Март 2011, 16:14:42 »
Mr2,
array a;
a=a ну или a(a).
Я прочитал твою мысль на расстоянии. :lol:
Только непонятно кто будет делать такое присвоение, и какой смысл в нём. :?

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #173 : 17 Март 2011, 16:17:11 »
Mr2, смысл в том что это приведёт к неработоспособности программы, эдакая дыра, так зачем же её держать открытой?

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1594
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #174 : 17 Март 2011, 16:24:54 »
Mr2, смысл в том что это приведёт к неработоспособности программы, эдакая дыра, так зачем же её держать открытой?
Как я понял спровацировать её(ошибку) может только сам программист, пользователь(программы) по идее не может заставить объект самокопироваться. Ну а присвоить объект самому себе придёт в голову только особо извращённым индивидам. :lol:
 То же самое что
 int i = 3;
 i=i;
 :lol:
 

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #175 : 17 Март 2011, 16:27:47 »
Mr2,ну а если была ссылка на a, а потом уже и не помнишь что это ссылка на a и пытаешься этой ссылке присвоить a, а?  :)

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1594
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #176 : 17 Март 2011, 16:36:44 »
Mr2,ну а если была ссылка на a, а потом уже и не помнишь что это ссылка на a и пытаешься этой ссылке присвоить a, а?  :)
Да тебе определённо нужно сделать проверку. :)
 Вообще с выделением памяти, указателями  нужно быть аккуратнее и не пихать их везде где можно без них обойтись.
 Я их вообще редко использую.Ну просто необходимости особой не возникает.Я только сегодня вник в копирующий  конструктор, до этого просто знал что он есть и когда его нужно использовать. ^_^

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #177 : 17 Март 2011, 16:42:33 »
Цитата: Mr2
Вообще с выделением памяти, указателями  нужно быть аккуратнее и не пихать их везде где можно без них обойтись.
А это почему же?

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1594
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #178 : 17 Март 2011, 16:48:02 »
А это почему же?
Ну если твоя программа состоит из пары строк то ничего страшного.
 А вот если из пары сотен, то тут уже будет трудно найдти какой указатель шалит(заставляет аварийно завершиться программу)
 или почему кончилась память. Тем более если ты " не помнишь что это ссылка на a и пытаешься этой ссылке присвоить a". :)

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #179 : 17 Март 2011, 16:57:17 »
Цитата
да это я чтобы пропустить элемент 0.
Неоправданная избыточность информации - плохой тон. Уменьшай индекс на 1. А если ты перепишешь класс под шаблоны и в каком-либо случае у тебя элементами будут служить объекты по 100МБ?

Цитата
Ну а если у меня сначала было Array a(5,5) .... а потом уже a=b, следовательно место под a изначально было же выделено.
По поводу того чтобы не копировались мои массивы для сравнения исправлю, спасибо за подсказку.
Во-первых, при создании присваивай переменной NULL, а при удалении делай так:
if(ptr)
{
   delete []ptr;
   ptr = NULL;
}
В прочем, если ты тут же выделяешь память, то присваивать NULL нет необходимости.

Цитата
Компилируется так - я и не использую
Что ты используешь? У меня в CodeBlocks не компилировалось, посмотрел мануалы - exit() объявлена в cstdio. Привыкнешь ещё, а потом будешь удивляться почему не компилируется в других средах...

Цитата
Не читал я ещё о enum, посмотрю что он из себя представляет. Через switch идея была сделать.
Это очень просто. enum [имя] {<элемент1>[=значение][, элемент2[=значение2], элемент3[=значение3], ...]} [переменные];
Т.е. enum X {a, b, c}; объявит перечисление X с элементами a, b, c, имеющими значения 0, 1, 2. Далее в коде их можно использовать как константы. Можно сделать так: enum {a = 10, b = 20, c}; - объявление безымянного перечисления, a=10, b=20, c=21.

P.S. Поменьше слушай Mr2, он часто глупости говорит. Или хотя бы обдумывай его слова, а не верь на слово.
А ещё плохо знаком с сабжем, раз осмеивает возможность присвоения объекту самому себе.
« Последнее редактирование: 17 Март 2011, 17:01:25 от HoRRoR »