Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

С++. Перегрузка оператора.

55K
26 февраля 2011 года
g00dv1n
22 / / 28.11.2010
Здраствуйте. Не могу перегрузить оператор - в подклассе, какието проблемы с памятью..
так жи при операции присваивания одному объкту класса другого , тоже что-то с памятью творица..
Пробовал перегрузить и переделать операцию присваивания тоже результата не дало .

Вот базовый класс

Код:
class Vegetable
{  
protected:
    float Mass;
    int  Ripeness;
    static unsigned int count;
public:
    Vegetable(): Mass(0), Ripeness(0)
    {
        count++;
    }
    Vegetable(float m, int r): Mass(m), Ripeness(r)
    {
        count++;
    }

    ~Vegetable(void)
    {
        count--;
    }
    unsigned int GetCount();
    float GetMass();
    int SetMass(float m);
    int GetRipeness();
    int SetRipeness(int r);
    void Fertilize();
    void Print();
    Vegetable operator ++();
    Vegetable operator --();

};

unsigned int Vegetable::count=0;

unsigned int Vegetable::GetCount(){
    return count;
}


Vegetable Vegetable::operator++(){
    return Vegetable(Mass,++Ripeness);
}

Vegetable Vegetable::operator--(){
    return Vegetable(Mass,--Ripeness);
}

float Vegetable::GetMass(){
    return Mass;
}

int Vegetable::SetMass(float m){
    if(m>0){
        Mass=m;
        return 1;
    }
    else
        return 0;
}


int Vegetable::GetRipeness(){
    return Ripeness;
}

int Vegetable::SetRipeness(int r){
    if(r>0){
        Ripeness=r;
        return 1;
    }
    else
        return 0;
}

void Vegetable::Fertilize(){
    Mass+=0.1;
}

void Print(){

}


А вот подкласс

Код:
#include "vegetable.h"
#include <string.h>
class Tomato :
    public Vegetable
{
private:
    char *Type;
    char *Size;
    char *Color;
    static unsigned int tomato_count;
public:

    Tomato(){
        Mass=0;
        Ripeness=0;
        Type=new char [strlen("unknown")+1];
        Type=new char [11];
        strcpy(Type,"unknown");
        Size=new char [strlen("unknown")+1];
        Size=new char [11];
        strcpy(Size,"unknown");
        Color=new char [strlen("unknown")+1];
        Color=new char [11];
        strcpy(Color,"unknown");
        tomato_count++;
        count--;
    }
    Tomato(float m, int r, char *t, char *s, char *c)
    {
        Type=new char [strlen(t)+1];
        strcpy(Type,t);
        Size=new char [strlen(s)+1];
        strcpy(Size,s);
        Color=new char [strlen(c)+1];
        strcpy(Color,c);
        Mass=m;
        Ripeness=r;
        count--;
        tomato_count++;
    }

    ~Tomato(void)
    {
        delete Type;
        delete Size;
        delete Color;
        tomato_count--;
    }
    int SetType(char* type);
    char *GetType();
    int SetSize(char* size);
    char *GetSize();
    int SetColor(char* color);
    char *GetColor();
    unsigned int GetTomato_count();
    Tomato operator -(Tomato object);
    //void operator =(Tomato object);
};

Tomato Tomato::operator-(Tomato object){
    if(Mass>object.Mass){
        return Tomato(Mass,Ripeness,Type,Size,Color);
    }
    else {
        return object;
    }
}

/*void Tomato::operator=(Tomato object){
    Type=new char [strlen(object.Type)+1];
    strcpy(Type,object.Type);
    Color=new char [strlen(object.Color)+1];
    strcpy(Color,object.Color);
    Size=new char [strlen(object.Size)+1];
    strcpy(Size,object.Size);
    Mass=object.Mass;
    Ripeness=object.Ripeness;
}*/

unsigned int Tomato::tomato_count=0;

unsigned int Tomato::GetTomato_count(){
    return tomato_count;
}

int Tomato::SetType(char *type){
    Type=new char [strlen(type)+1];
    strcpy(Type,type);
    return 1;
}

int Tomato::SetColor(char *color){
    Color=new char [strlen(color)+1];
    strcpy(Color,color);
    return 1;
}

int Tomato::SetSize(char *size){
    Size=new char [strlen(size)+1];
    strcpy(Size,size);
    return 1;
}

char * Tomato::GetColor(){
    return Color;
}

char * Tomato::GetSize(){
    return Size;
}

char * Tomato::GetType(){
    return Type;
}
12K
26 февраля 2011 года
Ghox
297 / / 26.07.2009
Сходу вижу проблему в вашем деструкторе: т.к. в конструкторах, под указатели вы везде выделяете память не под одну переменную, а под массив переменных, то и в деструкторе нужно использовать соответствующую версию оператора delete:
 
Код:
~Tomato(void)
    {
        delete[] Type;
        delete[] Size;
        delete[] Color;
        tomato_count--;
    }
Возможно что как раз из-за этого какие-то проблемы с памятью при вызове операторов, т.к. в вашей реализации, при каждом вызове, например, оператора "-" происходит создание временных объектов Tomato, с их последующим разрушением, сопровождающимся вызовом деструктора, а он у вас сейчас не всю память освобождает.

Ну и насчет оператора "=": насколько я знаю, операторная функция "=" должна возвращать ссылку на объект, у вас же результат не возвращается (void). Ну и еще нужно, перед выделением памяти заново под указатели-члены класса, предварительно очищать её. Думаю надо как-то так:
Код:
Tomato& Tomato::operator=(const Tomato& object){
    if(this == &object)
        return *this;
    delete[] Type;
    Type=new char [strlen(object.Type)+1];
    strcpy(Type,object.Type);
    delete[] Color;
    Color=new char [strlen(object.Color)+1];
    strcpy(Color,object.Color);
    delete[] Size;
    Size=new char [strlen(object.Size)+1];
    strcpy(Size,object.Size);
    Mass=object.Mass;
    Ripeness=object.Ripeness;
    return *this;
}
278
26 февраля 2011 года
Alexander92
1.1K / / 04.08.2008
Да и вообще, у вас слишком часто вместо ссылок возвращаются сами объекты, это не есть хорошо.
55K
26 февраля 2011 года
g00dv1n
22 / / 28.11.2010
Сделал возвращение по ссылке и в перегурзке "-" и все отлично. Спасибо за замечания!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог