Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> почему вылетает прога??? 
V
    Опции темы
yngwie19
Дата 13.10.2008, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Код

#include <iostream.h>
#include <windows.h>
#include <assert.h>

class Array
{
    friend ostream& operator<<(ostream&, Array);
    public:
        Array(int = 10);
        ~Array();
    private:
        int *ptr;
        int size;
};
int main()
{    
    Array integers1, integers2(7);
    
    cout<<integers1<<endl;
    cout<<integers2<<endl;

    return 0;

}

Array::Array(int arraySize)      
{
    size = arraySize;
    ptr = new int[size];
    assert(ptr!=0);

    for(int x = 0; x<size; x++)
        ptr[x] = 0;
}
Array::~Array()                 
{
    delete [] ptr;
}
ostream& operator<<(ostream& out, Array arr)
{
    for(int x = 0; x<arr.size; x++)
        out<<arr.ptr[x]<<' ';

    out<<endl;
    return out;
}

Вылетает если в main объекты объявлять так: первый объект с умолчанием, второй с аргументом 
Код

Array integers1(7), integers2;

а если наоборот
Код

Array integers1(7), integers2;

то все нормально

Это сообщение отредактировал(а) yngwie19 - 13.10.2008, 20:48
PM MAIL   Вверх
mes
Дата 13.10.2008, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(yngwie19 @  13.10.2008,  20:47 Найти цитируемый пост)
   friend ostream& operator<<(ostream&, Array);

в процедуру передается копия Array, а у этого класса нет копи ноструктора , поэтому указатель ptr у копии невалидный.
ну а еше Array лучше передавать по ссылке.

Цитата(yngwie19 @  13.10.2008,  20:47 Найти цитируемый пост)
Вылетает если в main объекты объявлять так: первый объект с умолчанием, второй с аргументом 

случайность





--------------------
PM MAIL WWW   Вверх
J0ker
Дата 13.10.2008, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(mes @  13.10.2008,  20:56 Найти цитируемый пост)
в процедуру передается копия Array, а у этого класса нет копи ноструктора , поэтому указатель ptr у копии невалидны

у копии-то валидный
невалидный он становится для оригинала после вызова деструктора у копии - т.е. при разрушении оригинала в delete[] передается уже дохлый указатель


--------------------
user posted image
PM MAIL   Вверх
yngwie19
Дата 13.10.2008, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



скасибо, все понятно, а скажите пожалуйста почему
Array integers(7)
и
Array integers = 7

одно и то же ???
PM MAIL   Вверх
IKM2007
Дата 13.10.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Цитата(yngwie19 @  13.10.2008,  21:45 Найти цитируемый пост)
скасибо, все понятно, а скажите пожалуйста почемуArray integers(7)иArray integers = 7одно и то же ???

Да.


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
vinter
Дата 13.10.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



это не одно и тоже, в первом случае это конструктор, во втором копирующий конструктор


--------------------
Мой блог
PM MAIL WWW   Вверх
IKM2007
Дата 13.10.2008, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



vinter, если не ошибаюсь, конструктор копии вызывается, когда копируется другой обьект класса. Например так:
Код

Array integers1(integers2);

что эквивалентно
Код

Array integers1=integers2;



--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
yngwie19
Дата 13.10.2008, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



vinter, в моем коде нет copy constructor, однако эти две формы работают одинаково.

IKM2007, Дак почему собственно это одинаково, объясни пожалуйста подробнее.
PM MAIL   Вверх
IKM2007
Дата 13.10.2008, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Цитата(yngwie19 @  13.10.2008,  22:17 Найти цитируемый пост)
IKM2007, Дак почему собственно это одинаково, объясни пожалуйста подробнее.

А что обьяснять? Принимай как есть.

Например пишешь.
Код

int x=7;

эквивалентно
Код

int x(7);




--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
J0ker
Дата 13.10.2008, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(yngwie19 @ 13.10.2008,  22:17)
vinter, в моем коде нет copy constructor, однако эти две формы работают одинаково.

IKM2007, Дак почему собственно это одинаково, объясни пожалуйста подробнее.

копиконстрактор и оператор присвоения генерируются компилятором если их не писать специально
выражение Array x = 7; приводит к вызову конструктора Array(7) - это оптимизация
однако код Array x; x = 7; не является эквивалентным

Добавлено через 10 минут и 54 секунды
кстати, вам нужно либо написать оператор присвоения и копиконстрактор, либо запретить их выносом в приватную секцию

Это сообщение отредактировал(а) J0ker - 13.10.2008, 22:39


--------------------
user posted image
PM MAIL   Вверх
yngwie19
Дата 13.10.2008, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



последний вопрос по поводу перегрузки операции индексации.
Сообственно определение функции такое:
Код

Array& operator[](int index) {return integers1.ptr[index]}


Вопрос в том, почему когда в main пишем например 
Код

cout<<integer[5];

То все правильно работает, ведь судя из определения функции нужно писать так:
Код

cout<<integer[](5)

PM MAIL   Вверх
J0ker
Дата 13.10.2008, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(yngwie19 @  13.10.2008,  22:41 Найти цитируемый пост)
Сообственно определение функции такое:

такой функции быть не может
operator[] должен быть мембером класса
во-вторых видимо он у вас должен возвращать ссылку на элемент массива - int &

Цитата(yngwie19 @  13.10.2008,  22:41 Найти цитируемый пост)
То все правильно работает, ведь судя из определения функции нужно писать так:

потому, что это оператор - у него синтаксис такой

Добавлено через 55 секунд
и я вам настоятельно рекомендую закончить с оператором присвоения и копиконстрактором - иначе будут проблемы


--------------------
user posted image
PM MAIL   Вверх
yngwie19
Дата 13.10.2008, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



J0ker, Спасибо, сори действительно перепутал, нужно int&, т.е если Я правильно понимаю, то когда мы пишеи integer[7], то при компиляции генерируется integer.operator[](7) ?
PM MAIL   Вверх
J0ker
Дата 13.10.2008, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(yngwie19 @ 13.10.2008,  23:03)
J0ker, Спасибо, сори действительно перепутал, нужно int&, т.е если Я правильно понимаю, то когда мы пишеи integer[7], то при компиляции генерируется integer.operator[](7) ?

да
собственно вы можете это даже явно написать если хочется изврата  smile 


--------------------
user posted image
PM MAIL   Вверх
vinter
Дата 14.10.2008, 05:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(J0ker @  13.10.2008,  23:29 Найти цитируемый пост)
выражение Array x = 7; приводит к вызову конструктора Array(7) - это оптимизация

на основании чего сделан такой вывод? Подсветка кода соптимизировала? smile
Цитата(IKM2007 @  13.10.2008,  23:08 Найти цитируемый пост)
если не ошибаюсь, конструктор копии вызывается, когда копируется другой обьект класса. Например так:

вот, что это:
Цитата(yngwie19 @  13.10.2008,  22:45 Найти цитируемый пост)
Array integers = Array(7)

а теперь сделаем так:
Код

class Array
{
    friend ostream& operator<<(ostream&, Array);
    public:
        explicit Array(int = 10);
        ~Array();
    private:
        int *ptr;
        int size;
};

и ваш код не будет компилироваться smile


Это сообщение отредактировал(а) vinter - 14.10.2008, 05:06


--------------------
Мой блог
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0683 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.