powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / =
4 сообщений из 4, страница 1 из 1
=
    #33640023
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос состоит в следующем:
Есть иерархия классов

class Base1
{
int *ID;
int GetID(){return *ID;}
};

class Base2:public Base1
{
CString *Code;
CString GetCode(){return *Code;}

};

class Base3:public Base2
{
CString *Name;
CString GetName(){return *Name;}

Base3 & operator = (Base 3 & rhs);
};


Так вот в операторе присваивания необходимо инициализировать все переменные 3-х классов

Base3 & Base3 ::operator=(Base3 & rhs)
{
if (this == &rhs)
return *this;

ID = new int;
*ID = rhs.GetID();

Code = new CString;
*Code = rhs.GetCode();

Name = new CString;
*Name = rhs.GetName();
}

В таком варианте все работает и все ОК. Но это достаточно геморно, если у родителей много переменных-членов и всех их инициализировать приходится в классе потомке. Нельзя ли сделать так, чтобы каждый из родителей отвечал за инициализацию своих переменных членов.

Заранее спасибо.
...
Рейтинг: 0 / 0
=
    #33640213
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HomosumВопрос состоит в следующем:
Есть иерархия классов
...
В таком варианте все работает и все ОК. Но это достаточно геморно, если у родителей много переменных-членов и всех их инициализировать приходится в классе потомке. Нельзя ли сделать так, чтобы каждый из родителей отвечал за инициализацию своих переменных членов.

Заранее спасибо.

А почему в каждом классе не реализовать оператор присваивания, который будет копировать те члены, которые объявлены в этом классе и плюс к этому вызвать оператор присваивания родителя? Т.е. каждый "будет заниматься своим делом", а о членах объявленных выше по иерархии наследования пусть предки и заботятся.

Например так (для иллюстрации)

Код: plaintext
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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
#include <iostream>
#include <string>

using namespace std;

struct B1
{
    string m1;
    B1& operator =(const B1& rhs) {m1 = rhs.m1; m1 += "(copy)"; };
};

struct B2 : public B1
{
    string m2;
    B2& operator =(const B2& rhs) 
    {
        m2 = rhs.m2; m2 += "(copy)"; 
        B1::operator=(rhs);
    };
};

struct B3 : public B2
{
    string m3;
    B3& operator =(const B3& rhs) 
    {
        B2::operator=(rhs);
        m3 = rhs.m3; m3 += "(copy)"; 
    };
    void Print() {cout << m1 << " " << m2 << " " << m3 << endl;};
};

int main()
{
    B3 s1, s2;
    
    s1.m1 = "test1";
    s1.m2 = "test2";
    s1.m3 = "test3";

    s2 = s1;

    s2.Print();
    return  0 ;
}

...
Рейтинг: 0 / 0
=
    #33640374
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так напиши
void Base1::assign(const Base1& right)
void Base2::assign(const Base2& right)

и т.д.

Виртуальным его делать нет смысла. И в каждом классе придется переопределять operator = - оператор = не наследуется.
...
Рейтинг: 0 / 0
=
    #33640515
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, большое!!!
Сейчас же попробую.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / =
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]