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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
struct BASE
{
};
struct CHILD:public BASE
{
 CHILD(BASE* b)//вот какой-то конструктор, который 
//создет такой новый CHILD у которого BASE часть берется из
//переданного в конструктор BASE* b
 {
 };
};
int main()
{
 BASE *b=new BASE();
 CHILD *c=new CHILD(b);
 delete c;//удалился и c и b!!!
 //потому что они как-бы стали одним объектом
};


То есть, модифицировать объект родитель в объект потомок :)
Можно?
...
Рейтинг: 0 / 0
хитрое создание объектов - 3
    #33504270
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если "в лоб", тогда то, что ты хочешь, можно сделать двумя способами:

1) Конструктор CHILD, принимая указатель на BASE, выполнит всю необходимую инициализацию и удалит b.

2) Если при удалении CHILD должен удаляться и соотв. переданный BASE, то хранить переданный указатель и докрутить деструктор CHILD чтобы он удалял все сразу. Вот так по-рабочекрестьянски:

Код: 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.
#include <iostream>
using namespace std;

struct Base
{
    Base()
        { cout << "Base::ctor\n" ;}

    ~Base()
        { cout << "Base::dtor\n" ;}
};

struct Child : public Base
{
    Child(Base* pb) 
        { cout << "Child::ctor\n"; m_pb = pb;}

    ~Child() 
        { cout << "Child::dtor\n"; delete m_pb; }

private :
    Base *m_pb;
};

int main(int argc, char *argv[])
{
    {
        Base *pb = new Base;
        Child *pc = new Child(pb);

        delete pc;
    }

    return  0 ;
}

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

Код: plaintext
1.
2.
3.
4.
5.
   {
        Base b;
        Child *pc = new Child(&b);
        delete pc;
    }

Получите Segmentation fault и распишитесь.

Твое "потому что они как-бы стали одним объектом" на самом деле означает, что мы присвоив объект B другому объекту С (через конструктор, оператор присваивания, еще как-нибудь, не важно) должны воспользоваться информацией из него, сохранить все что надо в С и после этого забыть про B , т.к. все что в нем было теперь стало "сущностью" С . Если это то, что требуется, то рекомендую почитать толстую книжку по С++, где есть глава про умные указатели (smart pointers). Возможно натолкнет на какие-нть идеи :-)
...
Рейтинг: 0 / 0
хитрое создание объектов - 3
    #33504628
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в лоб и порабочекрестьянски я и сам умею :)
я думал, может компилятор умеет этого без меня :)

То есть, превращение объекта базового класса в объект производного класса возможно только если я заранее о таком превращении позабочусь на уровне обоих классов?
...
Рейтинг: 0 / 0
хитрое создание объектов - 3
    #33504681
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex_kТо есть, превращение объекта базового класса в объект производного класса возможно только если я заранее о таком превращении позабочусь на уровне обоих классов?Компилятор пока еще, к сожалению, не умеет читать мысли программера, а посему не может догадаться что тот хочет получить в результате такого приведения типов :)
...
Рейтинг: 0 / 0
хитрое создание объектов - 3
    #33504776
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чтение мыслей тут ни причем.
когда мы вызываем конструктор предка, мы, по сути, создаем объект класса предка.
так, вот. Если мы уже имеем созданный объект класса предка, то зачем нам вызывать конструктор предка? Пусть компилятор на его основе создаст объект класса потомка, естественно через конструктор потомка.
...
Рейтинг: 0 / 0
хитрое создание объектов - 3
    #33504829
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kв лоб и порабочекрестьянски я и сам умею :)
я думал, может компилятор умеет этого без меня :)


Насколько я понимаю вам нужно понять разницу
между типом данных ( класс) и переменной этого типа (обьект).

Если создается переменная типа базовый класс
то и позаботься об удалении должен тот кто его создает.

Если создается переменная типа класс наследник, то
она автоматически включает в себя все поля данных и методы базового класса.

Копилятор же может гарантировать автоматическое удаление только при выходе из области видимости. Если это наследник то все что было создано
автоматически будет и удалено автоматически.


alex_k
То есть, превращение объекта базового класса в объект производного класса возможно только если я заранее о таком превращении позабочусь на уровне обоих классов?

Если говорить о превращении то в чистом виде их делают
с помощью static_cast & dynamic_cast.
И путаницы с типами может стать еще больше,
по этой причине я их не использую .
...
Рейтинг: 0 / 0
хитрое создание объектов - 3
    #33504848
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
похоже, меня никто не понял. значит это не актуально.
забейте :)
спасибо за внимание
...
Рейтинг: 0 / 0
хитрое создание объектов - 3
    #33504885
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kчтение мыслей тут ни причем.
когда мы вызываем конструктор предка, мы, по сути, создаем объект класса предка.
так, вот. Если мы уже имеем созданный объект класса предка, то зачем нам вызывать конструктор предка? Пусть компилятор на его основе создаст объект класса потомка, естественно через конструктор потомка.

При создании класса наследника конструктор предка вызывается автоматом.
явно вызывать его не надо.
Код: 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.
class A
{
int a;
public:
A();
A(int fa) ;
~A();
}
.....
A::A(int fa):a(fa)
{}
.....
class B :public A
{
B();
B(int fa);
}

B::B() // здесь A() будет вызван автоматически.
{};
....
B::B(int fa) :A(fa)  // пример вызова  определенного(необходимого) 
//конструктора предка. В данном случае конструктор A(int fa) будет вызван 
//автоматически.
{
........
};


...
Рейтинг: 0 / 0
хитрое создание объектов - 3
    #33506143
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot alex_k]Вы уж простите мой флуд такой.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int main()
{
 BASE *b=new BASE();
 CHILD *c=new CHILD(b);
 delete c;//удалился и c и b!!!

 // Нет, удалится только с. b останется.

 //потому что они как-бы стали одним объектом

 // никто не стал одним объектом. Это два объекта, абсолютно
 // независимых. Никогда в C++ два объекта не могут стать одним.
};


То есть, модифицировать объект родитель в объект потомок :)
Можно?

Объект b можно модифицировать везде, где есть ссылка на него
в соответствие с общими правилами работы с ним.
...
Рейтинг: 0 / 0
хитрое создание объектов - 3
    #33506151
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если "в лоб", тогда то, что ты хочешь, можно сделать двумя способами:

1) Конструктор CHILD, принимая указатель на BASE, выполнит всю необходимую инициализацию и удалит b.

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

2) Если при удалении CHILD должен удаляться и соотв. переданный BASE, то хранить переданный указатель и докрутить деструктор CHILD чтобы он удалял все сразу. Вот так по-рабочекрестьянски:

Тоже как бы неправильно. Удалять должен только агрегат, если он есть. CHILD не агригирует BASE, иначе он бы был ответственным за его создание, и значит удалять должен не он.

Оба варианта, на самом деле плохие, потому что во-первых можно

Я бы сказал просто - потому что они плохие.

Единственно правильный вариант - использовать в конструкторе CHILD указатель на BASE и скопировать его данные в свой родительский подобъект, вызвав конструктор копирования BASE.
...
Рейтинг: 0 / 0
хитрое создание объектов - 3
    #33506601
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kТо есть, превращение объекта базового класса в объект производного класса возможно только если я заранее о таком превращении позабочусь на уровне обоих классов?

Превращение объекта базового класса в объект производного класса вообще невозможно НИКОГДА в С++.
...
Рейтинг: 0 / 0
хитрое создание объектов - 3
    #33506610
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
когда мы вызываем конструктор предка, мы, по сути, создаем объект класса предка.

Не создаем, а инициализируем уже созданный объект (хотя конечно инициализация - это часть создания объекта).

так, вот. Если мы уже имеем созданный объект класса предка, то зачем нам вызывать конструктор предка?

Другой объект класса предка.
...
Рейтинг: 0 / 0
хитрое создание объектов - 3
    #33506647
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Другой объект класса предка.
понятно.

спасибо всем за помощь :)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / хитрое создание объектов - 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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