Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
#1

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

21.07.2010, 17:15. Просмотров 412. Ответов 9
Метки нет (Все метки)

есть класс 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?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2010, 17:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос как реализовать перегрузку опрератора "="? (C++):

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Не корректно считает перегрузку оператора "-" после "+" - C++
Доброго дня. Помогите советом. Не корректно считает a - b и a * b , после подсчёта a + b. Понимаю что он сохраняет первое решение в...

Реализовать структуру "Анкета" с полями "Фамилия", "Пол" и "Адрес" - C++
Здравствуйте. Проходим тему Структуры, не могу понять, как определить количество, само задание: #include <iostream> #include...

Как сделать перегрузку операции ">"? - C++
Как сделать перегрузку операции ">"? Например b>a, если b и а объекты разработанного класса.

Создать классы "Computer", "Software", "User" и реализовать взаимодействие объектов этих типов между собой - C++
Помогите решить задачку,нужна в инст на экзамен. Составить программу реализующую: 1)классы,которые могут содержать...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно". Я так...

9
CheshireCat
Эксперт С++
2895 / 1244 / 78
Регистрация: 27.05.2008
Сообщений: 3,397
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.переменная;
1
nikkka
Мат в 32 хода
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
не могу разобратся..
0
CheshireCat
Эксперт С++
2895 / 1244 / 78
Регистрация: 27.05.2008
Сообщений: 3,397
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;
}
Ну и т.п.
1
nikkka
Мат в 32 хода
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
то же самое на другие переменные.
0
CheshireCat
Эксперт С++
2895 / 1244 / 78
Регистрация: 27.05.2008
Сообщений: 3,397
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; я позабыл в первоначальном посте.
1
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
21.07.2010, 18:23  [ТС] #7
CheshireCat, а вот теперь все ОК!...
спасибо!
0
ForEveR
21.07.2010, 19:09
  #8

Не по теме:

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

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

Не по теме:

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

0
CyBOSSeR
Эксперт С++
2304 / 1674 / 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) {
     // ...
  }
};
Опять же каждый класс должен отвечать за копирование только добавленных им полей.
0
22.07.2010, 00:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2010, 00:34
Привет! Вот еще темы с ответами:

Реализовать класс "Квадрат" с данными-членами "центр квадрата" и "сторона квадрата" - C++
Объявить класс по приведенному ниже заданию в соответствии с номером варианта и определить для него конструктор по умолчанию,...

Написать перегрузку operator+() для класса "Массив" - C++
Добрый день, Подскажите, как выйти правильно из ситуации: Array&amp; Array::operator+(const Array&amp; obj) { Array temp; ...

Написать перегрузку оператора "минус" для строк - C++
Такой вопрос, для строк нужно написать оператор &quot;минус&quot;, что это значит? Если оператор &quot;+&quot; конкатенация строк, то что такое оператор...

Создать класс "Дата" с конструкторами, деструктором, указанными методами. Выполнить перегрузку указанных операторов - C++
Создать класс Дата, с конструкторами, деструктором, установить дату, увеличить на 1 день (++), уменьшить на один день, добавить дни +=....


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru