Форум программистов, компьютерный форум CyberForum.ru

как реализовать перегрузку опрератора "="? - C++

Восстановить пароль Регистрация
 
nikkka
Мат в 32 хода
 Аватар для nikkka
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
21.07.2010, 17:15     как реализовать перегрузку опрератора "="? #1
есть класс Base:
C++
1
2
3
4
5
6
7
8
class Base
{
    private:
        ...   //переменные
    public:
        Base(...); //конструктор
        virtual Base operator=(Base d);
}
и класс Derived
C++
1
2
3
4
5
6
7
class Derived: public Base
{
    private:
        ... //новые переменыне
    public:
        virtual Derived operator=(Derived d);
}
как реализавать перегрузку оператора в классе Derived?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2010, 17:15     как реализовать перегрузку опрератора "="?
Посмотрите здесь:

Как сделать перегрузку операции ">"? C++
C++ хочу попробовать всунуть "for (int j=0; j<5; j++)" в cin. Как это можно реализовать?
Делаю простой текстовый редактор. Как реализовать в нём пункт "Заменить" как в блокноте? C++
Как реализовать указатель "n" размерности на разные объекты? C++
Создать класс "Дата" с конструкторами, деструктором, указанными методами. Выполнить перегрузку указанных операторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
21.07.2010, 17:46     как реализовать перегрузку опрератора "="? #2
1. Исправь немного объявление:
C++
1
2
3
4
5
class Base
{
    public:
        virtual Base& operator=(const Base& d);   /// <-- вот тут
}
и точно так же в Derived.
2. Ну и, собственно, в реализации пиши что-то типа
C++
1
переменная = d.переменная;
Только не забудь про указатели - с ними работа немного хитрее, для них надо освободить старую память и аллокировать новую (а сколько - это зависит от экземпляра d). Если "переменная" имеет не-POD тип и для нее правильно реализован operator=(), то смело пиши просто переменная = d.переменная;
nikkka
Мат в 32 хода
 Аватар для nikkka
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
21.07.2010, 17:49  [ТС]     как реализовать перегрузку опрератора "="? #3
CheshireCat, вот конкретный пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <string.h>
#ifndef _CD_H_
#define _CD_H_
class Cd
{
    private:
        char performers[50];
        char label[20];
        int selections;
        double playtime;
    public:
        Cd(char *s1, char *s2, int n, double x);
        Cd(const Cd &d);
        Cd();
        virtual ~Cd();
        virtual void Report() const;
        virtual Cd & operator=(const Cd & d);
};
class Classic: public Cd
{
    private:
        char task[50];
    public:
        Classic(char *s1, char *s2, int n, double x, char *s3);
        Classic(const Cd & d, char*s3);
        Classic(const Classic &d);
        Classic();
        virtual void Report() const;
        virtual Classic & operator=(const Classic &d);
};
#endif
не могу разобратся..
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
21.07.2010, 18:05     как реализовать перегрузку опрератора "="? #4
У тебя абсолютно все данные, входящие как в класс Cd, так и в класс Classic, относятся к POD. Поэтому собственная реализация operator=() тут не нужна абсолютно - достаточно встроенной (implicit), которую любезно сгенерирует компилятор за тебя, если ты уберешь объявления оператора из объявлений классов. Компилятор, кстати, заодно и заоптимизирует свою реализацию :-)
Ну, а так-то оно несложно:
C++
1
2
3
4
5
6
Cd & Cd::operator=(const Cd & d){
        strcpy(performers, d.performers);
        strcpy(label, d.label);
        selections = d.selections;
        playtime = d.playtime;
}
Ну и т.п.
nikkka
Мат в 32 хода
 Аватар для nikkka
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
21.07.2010, 18:11  [ТС]     как реализовать перегрузку опрератора "="? #5
Цитата Сообщение от CheshireCat Посмотреть сообщение
Cd & Cd::operator=(const Cd & d){
* * * * strcpy(performers, d.performers);
* * * * strcpy(label, d.label);
* * * * selections = d.selections;
* * * * playtime = d.playtime;
}
на это компилятор говорит что C:\Dev-Cpp\lib\cd.h In member function `virtual Classic& Classic::operator=(const Classic&)' `char Cd::performers[50]' is private within this context
то же самое на другие переменные.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
21.07.2010, 18:21     как реализовать перегрузку опрератора "="? #6
Естессно, они ж у тебя private и для наследника недоступны. Выходов - два: либо сделать их protected, либо применить хитрый трюк:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Cd & Cd::operator=(const Cd & d)
{
    strcpy(performers, d.performers);
    strcpy(label, d.label);
    selections = d.selections;
    playtime = d.playtime;
    return *this;
}
 
Classic & Classic::operator=(const Classic &d)
{
    Cd::operator=(d);
    strcpy(task, d.task);
    return *this;
}
Ну и конечно, return *this; я позабыл в первоначальном посте.
nikkka
Мат в 32 хода
 Аватар для nikkka
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
21.07.2010, 18:23  [ТС]     как реализовать перегрузку опрератора "="? #7
CheshireCat, а вот теперь все ОК!...
спасибо!
ForEveR
21.07.2010, 19:09
  #8

Не по теме:

nikkka, Что-то крайне знакомая программа... Всмысле задание. Писал я такое, когда проходил то-ли перегрузку, то-ли наследование... Что за книга?

nikkka
21.07.2010, 19:11  [ТС]
  #9

Не по теме:

Lavroff, Стивен Прата, Глава 13. Упражнения.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2010, 00:34     как реализовать перегрузку опрератора "="?
Еще ссылки по теме:

C++ Как реализовать взаимодействие классов в игре "Змейка"
Как возможно реализовать алгоритм сортировки "выбором" для строк матрицы? C++
Класс "Время", как реализовать работу со временем? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
22.07.2010, 00:34     как реализовать перегрузку опрератора "="? #10
Цитата Сообщение от CheshireCat Посмотреть сообщение
хитрый трюк
Я бы не назвал это трюком, просто выглядит довольно непривычно.
В общем случае, если необходимо не переопределить поведение оператора присваивания (что весьма мало вероятно), а дополнить, нужно как раз таки использовать данный прием. Это позволит независимо изменять реализацию оператора в базовом и производным классе, т.е. каждый из классов будет ответчать за те поля, которые были им добавлены.

В продолжении темы, в конструкторе копирования производного класса также нужно вызывать конструктор копирования базового:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Base {
public:
  Base(const Base& other) {
    //...
  }
};
 
class Derived : public Base {
public:
  Derived(const Derived& other)
  : Base(other) {
     // ...
  }
};
Опять же каждый класс должен отвечать за копирование только добавленных им полей.
Yandex
Объявления
22.07.2010, 00:34     как реализовать перегрузку опрератора "="?
Ответ Создать тему
Опции темы

Текущее время: 18:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru