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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [c++] перегрузка оператора -- 
V
    Опции темы
zhenya1
Дата 7.10.2010, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Проблема с перегрузкой оператора --.
(В одной книге по одному реализовано, а в другой - по другому smile Как правильно ?

(т.е. как я понял ,если написать ----fff то должна быть ошибка)

Код

CClient&operator --();
...
CClient&CClient::operator --()
    {
        
        *this=m_nAccountCount-1;
        return  *this;
    }
main(){
...
CClient fff;
--fff;
...


весь код:
Код

class CAccount
{
public:
    CAccount();
    CAccount(int x);
    ~CAccount();
    void InputData();
    void OutputData();
    friend CAccount operator+(const CAccount &a, const CAccount &b);
    friend CAccount operator-(const CAccount &a, const CAccount &b);
    friend CAccount operator*(const CAccount &a, const CAccount &b);
    friend CAccount operator/(const CAccount &a, const CAccount &b);
     int getSalary()
    {
        return m_nValue;
    }
private:
    int m_nID;
    int m_nValue;
};
CAccount::CAccount():m_nID(-1),m_nValue(-1){}
CAccount::~CAccount(){}
void CAccount::InputData()
{
    cout<<" Enter account ID:";
    cin>>m_nID;
    cout<<" Enter account value:";
    cin>>m_nValue;
}
void CAccount::OutputData()
{
    cout<<" account ID:" << m_nID <<" , Account Value: "<<m_nValue << endl;
}
CAccount::CAccount(int x)
{
    m_nID=x;
}
CAccount operator+(const CAccount &a,  const CAccount &b) 
{
    CAccount tmp(a);
    tmp.m_nID += b.m_nID;
    return tmp;
}
CAccount operator-(const CAccount &a,  const CAccount &b) 
{
    CAccount tmp(a);
    tmp.m_nID -= b.m_nID;
    return tmp;
}
CAccount operator*(const CAccount &a,  const CAccount &b) 
{
    CAccount tmp(a);
    tmp.m_nID *= b.m_nID;
    return tmp;
}
CAccount operator/(const CAccount &a,  const CAccount &b) 
{
    CAccount tmp(a);
    tmp.m_nID /= b.m_nID;
    return tmp;
}

class CClient
{
public:
    CClient();
    CClient(char *);
    ~CClient();
    void InputData();
    void OutputData();
    friend int getSalary(CClient &client, char * line);
    friend ostream& operator<<(ostream& os, const CClient& dt);
 CClient&operator --();
private:
    char *m_szName; 
    CAccount *m_pAccounts; 
    int m_nAccountCount; 
};
CClient::CClient()
{
    m_nAccountCount=0;
    m_pAccounts=NULL;
    m_szName=NULL;
}
void CClient::InputData()
{
    m_szName=new char[33];
    cout<<" input name:"<<endl;
    cin>>m_szName;
    cout<<" input amount of values:"<<endl;
    cin>>m_nAccountCount;
    m_pAccounts=new CAccount[m_nAccountCount];
    for(int i=0;i<m_nAccountCount;i++)
    {
        cout<<"enter["<<i<<"]account:"<<endl;
        m_pAccounts[i].InputData();
    }
}
void CClient::OutputData()
{
    cout<<" name: "<<m_szName<<endl;
    cout<<" accounts:"<<endl;
    for(int i=0;i<m_nAccountCount;i++)
    {
    m_pAccounts[i].OutputData();
    }
}
    CClient::~CClient()
{
    delete []m_pAccounts;
    delete []m_szName;
}
    CClient::CClient(char *name)
    {
        m_szName=new char[33];
        strcpy(m_szName,name);
    }
    ostream& operator<<(ostream& os, const CClient& dt)
    {
        os<<dt.m_szName<<endl;
        return os;
    }
    int getSalary(CClient & client, char * line) 
{
    if(strcmp(line,client.m_szName))return 0;
    int m_nValue = 0;
    for(int i = 0; i<client.m_nAccountCount; i++)
     m_nValue += client.m_pAccounts[i].getSalary();
    return m_nValue;
}
    CClient&CClient::operator --()
    {
        
        *this=m_nAccountCount-1;
        return  *this;
    }

class CBank
{
public:
    CBank();
    ~CBank();
    void InputData();
    void OutputData();
    void ShowSalary();
private:
    char *szName;
    CClient *m_pClients;
    int m_nClientCount;
};
CBank::CBank()
{
    szName=NULL;
    m_pClients=NULL;
    m_nClientCount=0;
}
void CBank::InputData()
{
    szName=new char [33];
    cout<<" input bank name:"<<endl;
    cin>>szName;

    cout<<" sizeof:"<<endl;
    cin>>m_nClientCount;
    m_pClients=new CClient[m_nClientCount];
    for(int i=0;i<m_nClientCount;i++)
    {
        m_pClients[i].InputData();
    }
}
void CBank::OutputData()
{
    cout<<"bank name: "<<szName<<endl;
    for(int i=0;i<m_nClientCount;i++)
    {
        m_pClients[i].OutputData();
    }
}
void CBank::ShowSalary()
    {
        char line[22];
        std::cout<<" input name:"<<std::endl;
        std::cin>>line;
        int m_nValue=0;
        for(int i = 0; i<m_nClientCount; i++)
        m_nValue += getSalary(m_pClients[i], line);
        std::cout<<"\n"<<m_nValue<<std::endl;
    }
CBank::~CBank()
{
    delete []m_pClients;
    delete []szName;
}
void main()
{
    CBank bank;
    cout<<"---Reading bank information---"<<endl;
    bank.InputData();
    system("cls");
    cout<<"---Reading bank information---"<<endl;
    bank.OutputData();
    bank.ShowSalary();
    system("PAUSE");
    system("cls");

    cout<<"+,- i t.d. "<<endl;
CAccount k,b(22),c(3);
k=b+c;
k.OutputData();
k=b-c;
k.OutputData();
k=b*c;
k.OutputData();
k=b/c;
k.OutputData();
CClient fff;
--fff;
    system("PAUSE");
}

PM MAIL   Вверх
Crafty
Дата 7.10.2010, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

CClient& operator--();
...
CClient& CClient::operator--()
    {
        
        --m_nAccountCount;
        return  *this;
    }

Цитата(zhenya1 @  7.10.2010,  22:37 Найти цитируемый пост)
т.е. как я понял ,если написать ----fff то должна быть ошибка

Тут все правильно, нету никакой ошибки. operator-- возвращает ссылку, а ссылка является l-value, следовательно нету никакой ошибки. А вот если объявлен постфиксный оператор, то ошибка будет, например так неправильно: 
Код

f----;


Это сообщение отредактировал(а) Crafty - 7.10.2010, 23:30
PM MAIL   Вверх
zhenya1
Дата 8.10.2010, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

ссылка является l-value

Как это понять?

Как тогда записывается перегрузка для постфиксной формы?
PM MAIL   Вверх
Crafty
Дата 8.10.2010, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



zhenya1, l-value = left-value, то есть может находиться с левой стороны оператора присвоения.

Цитата(zhenya1 @  8.10.2010,  23:02 Найти цитируемый пост)
Как тогда записывается перегрузка для постфиксной формы?

Код

CClient operator--(int);
...
CClient CClient::operator--(int)
{
  CClient temp(*this);
  --(*this);

  return  temp;
}


Добавлено через 1 минуту и 43 секунды
PS я вам советую почитать учебник по С++, почти все простые вопросы сразу отпадут.
PM MAIL   Вверх
zhenya1
Дата 9.10.2010, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Смотрите, почитал С. Майерса. Там вот так написано:

Код

CClient&operator++();
 const CClient operator++(int);

....
CClient&CClient::operator ++()
    {
        *this+=1;   // тут  ругается на эту строчку.
        return *this;
    }
    
const CClient CClient::operator++(int)
{
  CClient tmp=*this;
  ++(*this);
  return tmp;
}

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


Опытный
**


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

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



Код

CClient&CClient::operator ++()
    {
        *this+=1;   // тут  ругается на эту строчку.         <--- в классе не определен operator+=
        return *this;
    }

Нужно перегрузить оператор += прежде чем использовать его для объекта.


Это сообщение отредактировал(а) Crafty - 9.10.2010, 21:29
PM MAIL   Вверх
zhenya1
Дата 10.10.2010, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Можно ли написать вот так, вместо += ( а то нигде не описывается перегрузка +=):
CClient&CClient::operator ++()
    {
        //*this+=1;
        m_nAccountCount++;
        return *this;
    }

PM MAIL   Вверх
Crafty
Дата 10.10.2010, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



zhenya1, можно.
PM MAIL   Вверх
zhenya1
Дата 10.10.2010, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 И последнне, что не получается (перегрузка <<):
Код

friend ostream& operator<<(ostream& os, const CClient& dt);
...
CClient::CClient(char *name)  
    {
        delete []m_szName;
        m_szName=new char[33];
        strcpy(m_szName,name);
    }
...
    ostream& operator<<(ostream& os, const CClient& dt)
    {
        os<<dt.m_szName<<endl;
        return os;
    }
main()
{
CClient dt("fwfw");
cout<<dt<<endl;
}


Это сообщение отредактировал(а) zhenya1 - 10.10.2010, 19:02
PM MAIL   Вверх
Crafty
Дата 10.10.2010, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



zhenya1,  строку 
Код

 delete []m_szName;
 нужно добавить в деструктор.

Код

CClient::CClient(char *name)  
    {
        delete []m_szName;        // нельзя удалять еще не созданные данные!!!
        m_szName=new char[33];
        strcpy(m_szName,name);
    }


Это сообщение отредактировал(а) Crafty - 10.10.2010, 19:10
PM MAIL   Вверх
zhenya1
Дата 10.10.2010, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



И , даже, вот так может сделать:
Код

CClient::CClient(char *name) // просто выделить память под массив.
    {
      name=new char [44];
    }

...
Но все равно ошибка .
PM MAIL   Вверх
Crafty
Дата 10.10.2010, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

    CClient::CClient(char *name) : m_nAccountCount(NULL), m_pAccounts(NULL), m_szName(NULL)
    {
        m_szName = new char[33];
        strcpy(m_szName,name); 
    }


Советую использовать класс string из stl вместо всяких указателей на char и работы с динамической памятью, ошибок будет значительно меньше.
PM MAIL   Вверх
zhenya1
Дата 10.10.2010, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня так изначально было :( и тоже ошибка была.( вылазит там что-то типа strlen )

Цитата

Советую использовать класс string из stl вместо всяких указателей на char и работы с динамической памятью, ошибок будет значительно меньше. 

Я пока не знаком с такими вещами (точнее мне еще нельзя это применять)
PM MAIL   Вверх
Crafty
Дата 11.10.2010, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



zhenya1,  выложите вашу последнюю версию кода.

Добавлено @ 00:10
Цитата(zhenya1 @  11.10.2010,  00:15 Найти цитируемый пост)
У меня так изначально было :( и тоже ошибка была.( вылазит там что-то типа strlen )

Точно также было? Я у вас в первом посте не заметил список инициализации в конструкторах CClient.


Это сообщение отредактировал(а) Crafty - 11.10.2010, 00:11
PM MAIL   Вверх
zhenya1
Дата 11.10.2010, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот вся последняя версия.

Код

class CAccount
{
public:
    CAccount();
    CAccount(int x);
    ~CAccount();
    void InputData();
    void OutputData();
    friend CAccount operator+(const CAccount &a, const CAccount &b);
    friend CAccount operator-(const CAccount &a, const CAccount &b);
    friend CAccount operator*(const CAccount &a, const CAccount &b);
    friend CAccount operator/(const CAccount &a, const CAccount &b);
     int getSalary()
    {
        return m_nValue;
    }
private:
    int m_nID;
    int m_nValue;
};
CAccount::CAccount():m_nID(-1),m_nValue(-1){}
CAccount::~CAccount(){}
void CAccount::InputData()
{
    cout<<" Enter account ID:";
    cin>>m_nID;
    cout<<" Enter account value:";
    cin>>m_nValue;
}
void CAccount::OutputData()
{
    cout<<" account ID:" << m_nID <<" , Account Value: "<<m_nValue << endl;
}
CAccount::CAccount(int x)
{
    m_nID=x;
}
CAccount operator+(const CAccount &a,  const CAccount &b) 
{
    CAccount tmp(a);
    tmp.m_nID += b.m_nID;
    return tmp;
}
CAccount operator-(const CAccount &a,  const CAccount &b) 
{
    CAccount tmp(a);
    tmp.m_nID -= b.m_nID;
    return tmp;
}
CAccount operator*(const CAccount &a,  const CAccount &b) 
{
    CAccount tmp(a);
    tmp.m_nID *= b.m_nID;
    return tmp;
}
CAccount operator/(const CAccount &a,  const CAccount &b) 
{
    CAccount tmp(a);
    tmp.m_nID /= b.m_nID;
    return tmp;
}

class CClient
{
public:
    CClient();
    CClient(char *);
    ~CClient();
    void InputData();
    void OutputData();
    friend int getSalary(CClient &client, char * line);
    friend ostream& operator<<(ostream& os, const CClient& dt);
 CClient&operator++();
 const CClient operator++(int);
private:
    char *m_szName; 
    CAccount *m_pAccounts; 
    int m_nAccountCount; 
};
CClient::CClient()
{
    m_nAccountCount=0;
    m_pAccounts=NULL;
    m_szName=NULL;
}
void CClient::InputData()
{
    m_szName=new char[33];
    cout<<" input name:"<<endl;
    cin>>m_szName;
    cout<<" input amount of values:"<<endl;
    cin>>m_nAccountCount;
    m_pAccounts=new CAccount[m_nAccountCount];
    for(int i=0;i<m_nAccountCount;i++)
    {
        cout<<"enter["<<i<<"]account:"<<endl;
        m_pAccounts[i].InputData();
    }
}
void CClient::OutputData()
{
    cout<<" name: "<<m_szName<<endl;
    cout<<" accounts:"<<endl;
    for(int i=0;i<m_nAccountCount;i++)
    {
    m_pAccounts[i].OutputData();
    }
}
    CClient::~CClient()
{
    delete []m_pAccounts;
    delete []m_szName;
}
    CClient::CClient(char *name)
    {
  m_szName = new char[33];
        strcpy(m_szName,name); 
    }
    ostream& operator<<(ostream& os, const CClient& dt)
    {
        os<<dt.m_szName<<endl;
        return os;
    }

    int getSalary(CClient & client, char * line) 
{
    if(strcmp(line,client.m_szName))return 0;
    int m_nValue = 0;
    for(int i = 0; i<client.m_nAccountCount; i++)
     m_nValue += client.m_pAccounts[i].getSalary();
    return m_nValue;
}
    CClient&CClient::operator ++()
    {
        //*this+=1;
        m_nAccountCount++;
        return *this;
    }
    
const CClient CClient::operator++(int)
{
  CClient tmp=*this;
  ++(*this);
  return tmp;
}


class CBank
{
public:
    CBank();
    ~CBank();
    void InputData();
    void OutputData();
    void ShowSalary();
private:
    char *szName;
    CClient *m_pClients;
    int m_nClientCount;
};
CBank::CBank()
{
    szName=NULL;
    m_pClients=NULL;
    m_nClientCount=0;
}
void CBank::InputData()
{
    szName=new char [33];
    cout<<" input bank name:"<<endl;
    cin>>szName;

    cout<<" sizeof:"<<endl;
    cin>>m_nClientCount;
    m_pClients=new CClient[m_nClientCount];
    for(int i=0;i<m_nClientCount;i++)
    {
        m_pClients[i].InputData();
    }
}
void CBank::OutputData()
{
    cout<<"bank name: "<<szName<<endl;
    for(int i=0;i<m_nClientCount;i++)
    {
        m_pClients[i].OutputData();
    }
}
void CBank::ShowSalary()
    {
        char line[22];
        std::cout<<" input name:"<<std::endl;
        std::cin>>line;
        int m_nValue=0;
        for(int i = 0; i<m_nClientCount; i++)
        m_nValue += getSalary(m_pClients[i], line);
        std::cout<<"\n"<<m_nValue<<std::endl;
    }
CBank::~CBank()
{
    delete []m_pClients;
    delete []szName;
}
void main()
{
    CBank bank;
    cout<<"---Reading bank information---"<<endl;
    bank.InputData();
    system("cls");
    cout<<"---Reading bank information---"<<endl;
    bank.OutputData();
    bank.ShowSalary();
    system("PAUSE");
    system("cls");

    cout<<"+,- i t.d. "<<endl;
CAccount k,b(22),c(3);
k=b+c;
k.OutputData();
k=b-c;
k.OutputData();
k=b*c;
k.OutputData();
k=b/c;
k.OutputData();
CClient fff;
++fff;

fff++;
CClient dt("knedlik");
cout<<dt<<endl;
    system("PAUSE");
}

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

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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