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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с перегрузкой операторов в классе 
:(
    Опции темы
erslgoeirjh
Дата 8.11.2013, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я создал класс myNVector для работы с векторами произвольного размера:

в заголовочном файле:

Код

class myNVector
{
public:
myNVector();
myNVector(int n);
myNVector(int n, long double *massif);
~myNVector();
myNVector& operator=(const myNVector &vect);
friend const myNVector& operator+(const myNVector& vect1, const myNVector& vect2);
//...
public:
int n; // размерность вектора
long double *massif; // элементы вектора
}


в cpp-файле:

Код

//...

myNVector::myNVector()
{
    n = 0;
    massif = NULL;
}

myNVector::myNVector(int n)
{
    int i;

    this->n = n;
    this->massif = new long double[n];
    for (i=0; i<n; i++)
    {
        this->massif[i] = 0.0;
    }
}

myNVector::myNVector(int n, long double *massif)
{
    int i;
    
    this->n = n;
    this->massif = new long double[n];
    for (i=0; i<n; i++)
    {
        this->massif[i] = massif[i];
    }
}

myNVector::~myNVector()
{
    if (massif != NULL)
    {
        delete []massif;
        massif = NULL;
    }
    n = 0;
}

myNVector& myNVector::operator=(const myNVector &vect)
{
    int i;
    long double* p;

    if (this->massif != NULL)
    {
        p = this->massif;
        delete []p;
        this->massif = NULL;
    }
    this->n = vect.n;
    this->massif = new long double[n]; 
    memmove(this->massif, vect.massif, this->n*sizeof(long double));
    return *this;
}

const myNVector& operator+(const myNVector& vect1, const myNVector& vect2)
{
    int i;
    myNVector  resvect;

    resvect.n = vect1.n;
    resvect.massif = new long double[resvect.n];

    for (i=0; i<vect1.n; i++)
    {
        resvect.massif[i] = vect1.massif[i] + vect2.massif[i];
    }
    return resvect;
}

// ...



В основной программе:


Код

myNVector AVect(2), Avect2(2), Ares(2);

Avect.massif[0] = 7.0;
Avect.massif[1] = 8.0;
Avect2.massif[0] = 9.0;
Avect2.massif[1] = 10.0;

Ares = Avect + Avect2;



И вот на этой последней строке 

Код

Ares = Avect + Avect2;



программа бьётся. Выскакивает окно с сообщением:


Цитата

Debug Error!
Program: f:\Roman\Roman\testvecmat.exe
Invalid allocation size: 4294967295 bytes
(Press Retry to debug the application).



В отладчике в функции operator+(const myNVector& vect1, const myNVector& vect2) всё нормально, а потом происходит обращение к функции operator=(const myNVector &vect) и там с самого начала у переменной vect поле n равно -858993460 , а поле massif вообще не читается.

В чём причина этого? Как исправить ошибку, чтобы Ares = Avect + Avect2; нормально работало?

PM MAIL   Вверх
baldina
Дата 8.11.2013, 17:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



operator+() возвращает ссылку на локальную переменную, которой к моменту завершения функции уже не существует.
надо заменить возвращаемое значение со ссылки на переменную
Код

myNVector operator+(const myNVector& vect1, const myNVector& vect2);


Добавлено через 6 минут и 51 секунду
и конструктора копии не хватает
Код

myNVector(const myNVector&);

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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