powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как спрятать кастинг под капот
25 сообщений из 86, страница 1 из 4
Как спрятать кастинг под капот
    #38074830
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <iostream>
using namespace std;

class A { public: A() {} };
class B : public A { };

B* globalStore = 0;
B*& b() { return globalStore = globalStore ? globalStore : new B; }

int main()
{
    b() = (B*) new A; // как этот кастинг спрятать в класс
    return 0;
}



Все знают, что существует перегрузка кастинг оператора (). Подскажите как в этом случае можно заменить явный кастинг (explicit) на неявный (implicit)
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38074853
Какой-то сумасшедший код :)
Вернуть ссылку на указатель созданного объекта и реинтерпрет-кастом перекастить предка в наследника, при этом потеряв укаатель на созданный объект B - это круто :)
Явно вы не этого хотели, т.к. любое обращение к членам данным класса B вызовет ошибку.

Так что ли?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <iostream>
using namespace std;

class A { public: A() {} };
class B : public A { public: void operator=(A *a) { /* ... */ delete a; } };

B* globalStore = 0;
B*& b() { return globalStore = globalStore ? globalStore : new B; }

int main()
{
    *b() = new A; // как этот кастинг спрятать в класс
    return 0;
}
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38074859
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <iostream>
using namespace std;

class A { public: A() {} };
class B : public A { };

B* globalStore = 0;
B*& b() { return globalStore = globalStore ? globalStore : new B; }

int main()
{
    b() = (B*) new A; // как этот кастинг спрятать в класс
    return 0;
}



Все знают, что существует перегрузка кастинг оператора (). Подскажите как в этом случае можно заменить явный кастинг (explicit) на неявный (implicit)


Помоему тут вобще все нужно менять :)

ИМХО лыжи в этой конструкции :
b() = (B*) new A; // как этот кастинг спрятать в класс

не поедут
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38074860
Фотография kosh the best
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фабрика?
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38074874
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДохтаР
ИМХО лыжи в этой конструкции :
b() = (B*) new A; // как этот кастинг спрятать в класс

не поедут

Не знаю, что имеется ввиду, но приведенный выше пример отлично компилится и работает!!
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38074875
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
реинтерпрет-кастомВернуть ссылку на указатель созданного объекта и реинтерпрет-кастом перекастить предка в наследника, при этом потеряв укаатель на созданный объект B - это круто :)


С этой проблемой лучшие умы форума помогают мне справится в соседней 13611210 теме. )))
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38074877
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
реинтерпрет-кастомЯвно вы не этого хотели, т.к. любое обращение к членам данным класса B вызовет ошибку.

Вообще-то именно это-го я и хотел:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
...

void usager(A* p) { }
int main()
{
    b() = new A;
    usager(b());
    return 0;
}



насчет того, что это не будет работать и вызовет ошибку... щас проверю...
*b() не вариант, для пользователей это слишком трудно
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38074884
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
реинтерпрет-кастом
Так что ли?
Код: plaintext
1.
2.
class A { public: A() {} };
class B : public A { public: void operator=(A *a) { /* ... */ delete a; } };



Нет, в момент b() = new A ваш оператор не вызывается вообще!
operator A() {} тоже не вызывается
похоже, что в данном случае я ищу что-то типа

Код: plaintext
1.
class A { public: operator this() { return *this; } }



потому что мы же не можем написать так

Код: plaintext
1.
class A { public: operator B() { return *this; } }



ведь мы не знаем всех имен наследников...
а если и узнаем, то заколебемся перечислять...
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38074885
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix(B*) new A;
Не знаю, что имеется ввиду, но приведенный выше пример отлично компилится и работает!!
Ну и код который читает/пишет в случайный адрес памяти тоже откомпилируется и тоже может работать без видимых ошибок.
Но это не значит что он корректный.
А приведение предка к наследнику и работа с ним как с наследником - это по уровню безумия прямой аналог такого кода.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38074888
Lumixреинтерпрет-кастомВернуть ссылку на указатель созданного объекта и реинтерпрет-кастом перекастить предка в наследника, при этом потеряв укаатель на созданный объект B - это круто :)


С этой проблемой лучшие умы форума помогают мне справится в соседней 13611210 теме. )))
Они там глумятся и не понимают чего вы хотите :)

А проблемы у вас тут 2:
1. ссылка большого типа на объект маленького типа (наследника на предка) - выход за границы объекта это Undefined Behavior
2. потеря значения указателя на new B - утечка памяти это Memory Leak

В общем будет увеличиваться размер программы и выскакивать исключения, насколько часто - зависит от контекста.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38074890
Lumixреинтерпрет-кастомТак что ли?
Код: plaintext
1.
2.
class A { public: A() {} };
class B : public A { public: void operator=(A *a) { /* ... */ delete a; } };



Нет, в момент b() = new A ваш оператор не вызывается вообще!
operator A() {} тоже не вызывается
похоже, что в данном случае я ищу что-то типа

Код: plaintext
1.
class A { public: operator this() { return *this; } }



потому что мы же не можем написать так

Код: plaintext
1.
class A { public: operator B() { return *this; } }



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


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <iostream>
using namespace std;

class A { public: A() {} };
class B : public A { public: void operator=(A *a) { /* ... */ delete a; cout << "operator=" << endl; } };

B* globalStore = 0;
B*& b() { return globalStore = globalStore ? globalStore : new B; }

int main()
{
    *b() = new A; // как этот кастинг спрятать в класс
    return 0;
}


выводoperator=
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38074919
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНу и код который читает/пишет в случайный адрес памяти тоже откомпилируется и тоже может работать без видимых ошибок.

Мы ведь не пишем в случайный адрес, потому что функция b() дает нам указатель через ссылку. Случайная запись была бы если бы мы писали в указатель, который нам вернула функция, то есть она вернула бы нам копию указателя, а не сам указатель. А тут вроде все чисто...

поправьте если я что-то упустил...

Anatoly MoskovskyА приведение предка к наследнику и работа с ним как с наследником - это по уровню безумия прямой аналог такого кода.

В нашем случае архитектура системы гарантирует, что c b() будут работать как с А.

Другой вопрос, если вы намекаете, что сишный кастинг не достраивает объект вверх, а только копирует предка в начало памяти под объект наследника, а оставшийся кусок просто берется из случайных данных в памяти, тогда да, риски возрастают...

но и соответственно возникает вопрос: как организовать кастинг А с автоматической достройкой до дефолтного объекта B в той части, в которой B превышает А??
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38074920
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
реинтерпрет-кастом
Они там глумятся и не понимают чего вы хотите :)



Ну глумятся, ну и что... ))) а на каком форуме не глумятся?? ))) главное, что задача успешна решена. Некий доктор помог...)))
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38074922
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
реинтерпрет-кастом
А проблемы у вас тут 2:
1. ссылка большого типа на объект маленького типа (наследника на предка) - выход за границы объекта это Undefined Behavior
2. потеря значения указателя на new B - утечка памяти это Memory Leak

В общем будет увеличиваться размер программы и выскакивать исключения, насколько часто - зависит от контекста.

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

А вот насчет первого пункта... У вас есть идеи как автоматом достраивать этот кусок "надстроку" до неких дефолтных значений предка??
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38074927
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
реинтерпрет-кастомвыводoperator=

да, подтверждаю, что работает, но два 2 но:

1. как-то звездочку надо спрятать *b() =
2. а тут /* ... */ вы случайно не на ручное почленное копирование намекаете??? если да, то это не вариант, они никто этого делать не будут, они тогда будут сишно кастить...
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38074963
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixпоправьте если я что-то упустил...



Вы упустили ключевую концепцию языка С++
в третем сообшении топика ссылка про лыжи .
Почитайте внимательно , посмотрите примеры.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38074985
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixДохтаРИМХО лыжи в этой конструкции :
b() = (B*) new A; // как этот кастинг спрятать в класс

не поедут

Не знаю, что имеется ввиду, но приведенный выше пример отлично компилится и работает!!





процитируйте пункт из ссылки что вы всетаки имели ввиду
написав
b() =

И какое поведение вы ожидаете от компилятора в этом случае.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38075025
Lumixреинтерпрет-кастомпропущено...


да, подтверждаю, что работает, но два 2 но:

1. как-то звездочку надо спрятать *b() =
2. а тут /* ... */ вы случайно не на ручное почленное копирование намекаете??? если да, то это не вариант, они никто этого делать не будут, они тогда будут сишно кастить...
Я ни на что не намекаю, так как абсолютно не понятно что нужно :)

В большинстве случаев можно поспорить насчет извратов, но в данном случае 100% планировалось что-то другое. Может это?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include <iostream>
#include <memory>
using namespace std;

class A { public: A() {} };
class B : public A { };

std::shared_ptr<A> globalStore((B*)NULL);
std::shared_ptr<A>& a() { return globalStore = globalStore ? globalStore : std::shared_ptr<A>(new A); }

int main()
{
    a() = std::shared_ptr<A>(new B); // как этот кастинг спрятать в класс

    return 0;
} 
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38075040
ДохтаРLumix
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <iostream>
using namespace std;

class A { public: A() {} };
class B : public A { };

B* globalStore = 0;
B*& b() { return globalStore = globalStore ? globalStore : new B; }

int main()
{
    b() = (B*) new A; // как этот кастинг спрятать в класс
    return 0;
}



Все знают, что существует перегрузка кастинг оператора (). Подскажите как в этом случае можно заменить явный кастинг (explicit) на неявный (implicit)


Помоему тут вобще все нужно менять :)

ИМХО лыжи в этой конструкции :
b() = (B*) new A; // как этот кастинг спрятать в класс

не поедут
Здесь как раз lvalue-rvalue проблемы нет, проблемы 2, о которых я писал выше.
У автора заблуждений и без вас хватает.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38075197
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <iostream>
using namespace std;

class A { public: A() {} };
class B : public A { };

B* globalStore = 0;
B*& b() { return globalStore = globalStore ? globalStore : new B; }

int main()
{
    b() = (B*) new A; // как этот кастинг спрятать в класс
    return 0;
}



Все знают, что существует перегрузка кастинг оператора (). Подскажите как в этом случае можно заменить явный кастинг (explicit) на неявный (implicit)

Никак. Перегрузка существует у класса, а это не класс, а указатель на него.

К тому же каст не верный, заведомо левый.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38076142
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДохтаРпроцитируйте пункт из ссылки что вы всетаки имели ввиду
написав
b() =


Не совсем понял какую цитату вы от меня ждете. Я далек от академических кругов... я сугубо практик...


[quot ДохтаР]Lumixпропущено...И какое поведение вы ожидаете от компилятора в этом случае.

странный вопрос...
ведь я начал тему с полностью рабочего примера, который 100% делает то, что я от него хочу
хотя конечно для протокола я могу и явно объявить свои намерения

я хочу чтобы строчка b() = new A; помещала адрес этого объекта в указатель globalStore
сейчас с этой задачей справляется строчка b() = (B*) new A; и стоит задача спрятать кастинг
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38076150
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
реинтерпрет-кастомЯ ни на что не намекаю, так как абсолютно не понятно что нужно :)


я хочу чтобы строчка b() = new A; помещала адрес этого объекта в указатель globalStore
сейчас с этой задачей справляется строчка b() = (B*) new A; и стоит задача спрятать кастинг

реинтерпрет-кастомВ большинстве случаев можно поспорить насчет извратов, но в данном случае 100% планировалось что-то другое. Может это?

100% нет
что планировалось, то и было реализовано в 100% рабочем примере в самом верху
стоит лишь задача спрятать каст
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38076154
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНикак. Перегрузка существует у класса, а это не класс, а указатель на него.

ок понял
видимо поэтому РК пошел по пути *b()
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38076178
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix я хочу чтобы строчка b() = new A; помещала адрес этого объекта в указатель globalStore
сейчас с этой задачей справляется строчка b() = (B*) new A;нет, не справляется. в этой строчке - ошибка, и она со всей серьёзностью проявит себя как только класс B начнёт содержать поля, которых нет в родителе. С большой долей вероятности ошибка будет проявляться в самых неожиданных частях программы, казалось бы, никак не связанных с написанным здесь кодом

Lumixстоит лишь задача спрятать каста целью этой задачи стоит максимально затруднить отладку себе и окружающим, так?

Всем, всем, всем:
надеюсь вы понимаете, что своими советами вы рождаете чудовище? Он ведь библиотечный код пишет, кому-то ведь достанется _это_
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38076195
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
реинтерпрет-кастом
Код: plaintext
1.
2.
std::shared_ptr<A> globalStore((B*)NULL);
std::shared_ptr<A>& a() { return globalStore = globalStore ? globalStore : std::shared_ptr<A>(new A); }



кстати, а зачем тут ссылка?? ведь вроде shared для того и придумали, чтобы их можно было кидать через копии на границах между функциями... вроде ссылка нужна если бы вы построили решение на обычных умных указателях...
...
Рейтинг: 0 / 0
25 сообщений из 86, страница 1 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как спрятать кастинг под капот
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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