powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как спрятать кастинг под капот
86 сообщений из 86, показаны все 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
Как спрятать кастинг под капот
    #38076213
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychLumix я хочу чтобы строчка b() = new A; помещала адрес этого объекта в указатель globalStore
сейчас с этой задачей справляется строчка b() = (B*) new A;нет, не справляется. в этой строчке - ошибка, и она со всей серьёзностью проявит себя как только класс B начнёт содержать поля, которых нет в родителе. С большой долей вероятности ошибка будет проявляться в самых неожиданных частях программы, казалось бы, никак не связанных с написанным здесь кодом



Можете сформулировать конкретную модель угрозы, если я утверждаю, что в этом случае b() будет 100% использоваться только по А фейсу?? то есть только в условиях типа

Код: plaintext
1.
2.
3.
void usage(A* p);
b() = new A;
usage(b());



вот такое 100% исключено

Код: plaintext
1.
2.
3.
void usage(B* p);
b() = new A;
usage(b());




egorych Всем, всем, всем:
надеюсь вы понимаете, что своими советами вы рождаете чудовище? Он ведь библиотечный код пишет, кому-то ведь достанется _это_

Я наоборот о людях забочусь!! чтобы им было комфортнее работать...
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38076265
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixМожете сформулировать конкретную модель угрозы, если я утверждаю, что в этом случае b() будет 100% использоваться только по А фейсу??
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#include <iostream>
#include <string.h>
struct A 
{
   virtual ~A() {}  // так и быть, напишу, хотя не хотел, потому что здесь была ещё одна мина зарыта
   virtual void print() { std::cout << "I'm class A" << std::endl; }
};

class B : public A
{
   char *_name;
public:
   B() : _name( new char[ 12 ] ) { strcpy( _name, "I'm class B" ); }
   virtual ~B() { delete[] _name; }

  virtual void print() { std::cout << _name << std::endl; }
};

например

LumixЯ наоборот о людях забочусь!! чтобы им было комфортнее работать...бессонные ночи в отладке чужого кода, на мой взгляд, не то, что можно было назвать комфортом в работе.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38076301
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixя утверждаю, что в этом случае b() будет 100% использоваться только по А фейсу??задлянафига тогда и globalStore, и b() возвращают B*??? вырази свою мысль прямо и точно:
Код: plaintext
1.
2.
A* globalStore = 0;
A* b()  { return globalStore = globalStore ? globalStore : new B; }

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

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

Код: 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.
#include <iostream>
#include <string.h>
using namespace std;
struct A 
{
   virtual ~A() {}  // так и быть, напишу, хотя не хотел, потому что здесь была ещё одна мина зарыта
   virtual void print() { std::cout << "I'm class A" << std::endl; }
};

class B : public A
{
   char *_name;
public:
   B() : _name( new char[ 12 ] ) { strcpy( _name, "I'm class B" ); }
   virtual ~B() { delete[] _name; }

  virtual void print() { std::cout << _name << std::endl; }
};

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

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



egorychбессонные ночи в отладке чужого кода, на мой взгляд, не то, что можно было назвать комфортом в работе.

что-то я не припомню, чтобы кому-то приходилось заниматься отладкой кода, который я сдал в боевое использование...наоборот всем нравится, что благодаря моим решениям можно забыть про всякие штуки дрюки с плюсами и сосредоточится на самой программе
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38076389
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл в примере: если первой строчкой вставить b()->print(); то пишет В то есть тоже все круто работает
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38076395
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychзадлянафига тогда и globalStore, и b() возвращают B*??? вырази свою мысль прямо и точно:
Код: plaintext
1.
2.
A* globalStore = 0;
A* b()  { return globalStore = globalStore ? globalStore : new B; }



потому что №1

Код: plaintext
1.
2.
3.
4.
void usage(A* a);
init() { usage(b()); }
event1() { b() = new A; }
event2() { b() = new B; } 



потому что №2

Код: plaintext
1.
b() = getA(); // из сторонней либы которую мы не контроллируем
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38076825
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixвот такое 100% исключено

Код: plaintext
1.
2.
3.
void usage(B* p);
b() = new A;
usage(b());



Скажите, пожалуйста, каким образом вы гарантируете выполнение этого требования?
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38076847
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MozokСкажите, пожалуйста, каким образом вы гарантируете выполнение этого требования?
Ну как же - строгая гарантия методом "на все воля божия" :)
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38076893
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 для того и придумали, чтобы их можно было кидать через копии на границах между функциями... вроде ссылка нужна если бы вы построили решение на обычных умных указателях...
Смотрите в этом случае:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
std::shared_ptr<A> globalStore((B*)NULL);
std::shared_ptr<A>& a() { return globalStore = globalStore ? globalStore : std::shared_ptr<A>(new A); }
void func() {
    // вот это
    a() = std::shared_ptr<A>(new B);

   // идентично этому
   {
        if(!globalStore) globalStore = std::shared_ptr<A>(new A);
        std::shared_ptr<A> &temp = globalStore;
        temp = std::shared_ptr<A>(new B);
   }

   // или этому
   {
        if(!globalStore) globalStore = std::shared_ptr<A>(new A);
        globalStore = std::shared_ptr<A>(new B);
   }
}





А в этом случае, без &:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
std::shared_ptr<A> globalStore((B*)NULL);
std::shared_ptr<A>& a() { return globalStore = globalStore ? globalStore : std::shared_ptr<A>(new A); }
void func() {
    // вот это
    a() = std::shared_ptr<A>(new B);

   // идентично этому
   {
        if(!globalStore) globalStore = std::shared_ptr<A>(new A);
        std::shared_ptr<A> temp = globalStore;
        temp = std::shared_ptr<A>(new B);
   } // и тут же потеряли temp с его new B
}




Позапускайте этот код с & и без:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#include <iostream>
#include <memory>
using namespace std;

class A { public: int i; A() { i = 0; } };
class B : public A { public: B() { i = 1; } };

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); // как этот кастинг спрятать в класс

    cout << globalStore->i;
    return 0;
} 
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38076895
Поправка :)

А в этом случае, без &:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
std::shared_ptr<A> globalStore((B*)NULL);
std::shared_ptr<A> a() { return globalStore = globalStore ? globalStore : std::shared_ptr<A>(new A); }
void func() {
    // вот это
    a() = std::shared_ptr<A>(new B);

   // идентично этому
   {
        if(!globalStore) globalStore = std::shared_ptr<A>(new A);
        std::shared_ptr<A> temp = globalStore;
        temp = std::shared_ptr<A>(new B);
   } // и тут же потеряли temp с его new B
}
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38076896
egorych Всем, всем, всем:
надеюсь вы понимаете, что своими советами вы рождаете чудовище? Он ведь библиотечный код пишет, кому-то ведь достанется _это_
А как название этой библиотеки?
Врага нужно знать в лицо! :)
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38077288
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
реинтерпрет-кастомПозапускайте этот код с & и без:
[/src]

про ссылку понятно, спасибо
теперь я кажется понял, что имел ввиду MasterZiv в соседней ветке 13622566

но в примере вы каким-то образом изменили условия задачи и движетесь в каком-то своем направлении, а именно: у вас shared_ptr<A>, а в задаче надо shared_ptr<B>

вот полностью рабочий пример

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <iostream>
#include <boost/shared_ptr.hpp>
using namespace std;
using namespace boost;

class A { public: int i; A() { i = 0; } };
class B : public A { public: B() { i = 1; } };

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

int main()
{
    b().reset((B*) new A); // как это же самое записать b() = new A;

    cout << b()->i << " " << globalStore->i;
    return 0;
}
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38078023
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока решение с оператором равно не найдено, запасным вариантом является вот это решение
но в нем динамик кастинг не работает

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include <boost/shared_ptr.hpp>
using namespace boost;

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

shared_ptr<B> globalStore((B*)0);
shared_ptr<B>& b() { return globalStore = globalStore ? globalStore : shared_ptr<B>(new B); }
shared_ptr<B> b(A* p) {  return dynamic_cast<shared_ptr<B> >(shared_ptr<A>(p)); }
shared_ptr<B> b(B* p) {  return shared_ptr<B>(p); }

int main()
{
    b() = b(new A);
    return 0;
}
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38078038
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixegorychзадлянафига тогда и globalStore, и b() возвращают B*??? вырази свою мысль прямо и точно:
Код: plaintext
1.
2.
A* globalStore = 0;
A* b()  { return globalStore = globalStore ? globalStore : new B; }



потому что №1

Код: plaintext
1.
2.
3.
4.
void usage(A* a);
init() { usage(b()); }
event1() { b() = new A; }
event2() { b() = new B; } 



потому что №2

Код: plaintext
1.
b() = getA(); // из сторонней либы которую мы не контроллируем

а во, нашлось ))) не вижу, чем "потому что №1" и "потому что №2" мешает сделать globalStorage указателем на A.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38078127
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychLumixпропущено...


потому что №1

Код: plaintext
1.
2.
3.
4.
void usage(A* a);
init() { usage(b()); }
event1() { b() = new A; }
event2() { b() = new B; } 



потому что №2

Код: plaintext
1.
b() = getA(); // из сторонней либы которую мы не контроллируем

а во, нашлось ))) не вижу, чем "потому что №1" и "потому что №2" мешает сделать globalStorage указателем на A.


в event2() могут быть обращения c b() как с B
разумеется внутри usage() гарантируется, что B будет использоваться только как А

но принимая во внимание пример, который вы привели тут 13626522 я понимаю, что b() = new A невозможно осуществить в принципе по причинам изложенным в моем выводе вот тут 13627171

пока что я в печали, но потом когда я приободрюсь и полученная инфа уложится в голове, возможно, я пойду по пути что-то типа:

Код: plaintext
1.
2.
3.
usage(a(1))
event1() { a(1) = a(2); }
event2() { a(1) = b(); }
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38078133
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixПока решение с оператором равно не найдено, запасным вариантом является вот это решение
но в нем динамик кастинг не работает

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include <boost/shared_ptr.hpp>
using namespace boost;

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

shared_ptr<B> globalStore((B*)0);
shared_ptr<B>& b() { return globalStore = globalStore ? globalStore : shared_ptr<B>(new B); }
shared_ptr<B> b(A* p) {  return dynamic_cast<shared_ptr<B> >(shared_ptr<A>(p)); }
shared_ptr<B> b(B* p) {  return shared_ptr<B>(p); }

int main()
{
    b() = b(new A);
    return 0;
}



так чисто для истории, если кому-то эта тема в поиск попадется:
с динамик кастингом получился облом
детали смотрите тут 13627171
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38078302
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixв event2() могут быть обращения c b() как с Bа вот тут как раз тебе поможет dynamic_cast:
Код: plaintext
1.
2.
3.
4.
void event2()
{ 
   if( dynamic_cast< B* >( b() ) ) { /* юзаешь его как B */ }
}



а чтобы быть уверенным, что класс A можно использовать в качестве базового, оберни его в переходник, и от него уже наследуй свои замечательные другие классы

Код: 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.
// чужой класс
class A
{ 
   public:
     void func1();
     void func2();
};

// чужой getA
A *getA();

class Base
{
   A *_a;
public:
   Base( A a ) : _a( a ) {}
   virtual ~Base() {}

public:
   void func1() { _a->func1(); }
   void func2() { _a->func2(); }
};

Base *getBase() { return Base( getA() ); }

что-то вроде этого, на правах сырой идеи, а не конечной реализации, потому что работать надо через смарт-указатели, и т.д., и т.п.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38078332
Фотография kosh the best
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix, я искренне надеюсь, что ты еще студент, а не работаешь и твой код не идет в продакшон!
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38078341
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychLumixв event2() могут быть обращения c b() как с Bа вот тут как раз тебе поможет dynamic_cast:
Код: plaintext
1.
2.
3.
4.
void event2()
{ 
   if( dynamic_cast< B* >( b() ) ) { /* юзаешь его как B */ }
}




а зачем, если у нас b() это 100% гарантия, что там B, ведь кастинг A => B оказался невозможен, причем именно благодаря вашим объяснениям!!

если код требует if( dynamic_cast< B* >( b() ) ) { это значит я плохо справляюсь со своей работой и зря ем свой хлеб)))


egorychа чтобы быть уверенным, что класс A можно использовать в качестве базового, оберни его в переходник, и от него уже наследуй свои замечательные другие классы

Код: 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.
// чужой класс
class A
{ 
   public:
     void func1();
     void func2();
};

// чужой getA
A *getA();

class Base
{
   A *_a;
public:
   Base( A a ) : _a( a ) {}
   virtual ~Base() {}

public:
   void func1() { _a->func1(); }
   void func2() { _a->func2(); }
};

Base *getBase() { return Base( getA() ); }

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

я понимаю, что это возможно технически, но никто этого делать не станет
тупо по экономическим и временнЫм причинам
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38078342
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kosh the bestLumix, я искренне надеюсь, что ты еще студент, а не работаешь и твой код не идет в продакшон!

я не стану вас разочаровывать, но правда наверное вам не понравится ))))
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38078591
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychLumixв event2() могут быть обращения c b() как с Bа вот тут как раз тебе поможет dynamic_cast:
Код: plaintext
1.
2.
3.
4.
void event2()
{ 
   if( dynamic_cast< B* >( b() ) ) { /* юзаешь его как B */ }
}



я обдумал эту идею
A* b() это невозможно в принципе с сигнатурной точки зрения, потому что в голове пользователей уже сидит правило, что A* a(); B* b();
но то, что вы предложили это по нашим правилам можно оформить так

Код: plaintext
1.
2.
3.
a() = b(); // апкаст
b(a())->drawB(); // "даункаст"
a()->drawB(); // запрещено правилами
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38078670
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix
Код: plaintext
1.
2.
#include <boost/shared_ptr.hpp>
shared_ptr<B>& b() { return globalStore = globalStore ? globalStore : shared_ptr<B>(new B); }


Это шутка такая?
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38078689
MozokLumix
Код: plaintext
1.
2.
#include <boost/shared_ptr.hpp>
shared_ptr<B>& b() { return globalStore = globalStore ? globalStore : shared_ptr<B>(new B); }


Это шутка такая?
Это пожалуй лучшая строчка из всего кода автора.
Соптимизируется до:
Код: plaintext
1.
2.
3.
4.
5.
#include <boost/shared_ptr.hpp>
shared_ptr<B>& b() { 
 if (!globalStore) globalStore = shared_ptr<B>(new B);
 return globalStore; 
}
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079153
Фотография kosh the best
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> я не стану вас разочаровывать, но правда наверное вам не понравится ))))
о боже!
просто напиши все это на си
так будет лучше
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079243
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kosh the best,

+1 меня тоже всегда поражали выкрутасы в С++ когда формально задача на уровне
постановки уже давно могла быть решена с использованием банальных процедуральных
каллбеков. И API бы выглядел от этого только чище. И все проблемы С++ по большей
части надуманны теми кто пишет код и сам себе Буратино. Не пишите так и проблем
не будет.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079662
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kosh the best> я не стану вас разочаровывать, но правда наверное вам не понравится ))))
о боже!
просто напиши все это на си
так будет лучше

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
stared_ptr<B> b(A* a)
{
     B* b = new B;
     memcpy(b, a, sizeof(a));  
     delete a;
     return shared_ptr<B>(b);
}

b() = b(new A);



Если вы про это, то скорее всего на строчке memcpy() нас ждет великий облом, если A содержит в себе датамеберы через указатели типа class A { int* a;};

но если вы подскажете, где взять супер функцию типа deep_memcpy() или true_memcpy() тогда было бы круто!!
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079679
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала с головой будет достаточно перестать превращать с++ в js.

1. Вы тратите много времени на борьбу с собственноручно созданными мельницами.

2. Результат все-равно на js не похож и не будет. Т.е. не достигнут. А путаница, которая будет мешать вашим "пользователям" достигнута.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079691
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix, этот вопрос вообще решают не в плоскости языка а в плоскости
алгоритмов и структур данных. Если у тебя есть такая структура как
дерево и тебе надо сделать копию поддерева то делай фукцию
copy_subtree(..) и копируй. Не вешай на С++ обязательства
которые к ЯП не имеют отношения.

Это неоправданное (и опасное) усложнение парадигмы.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079692
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О том, что вы задачу в двух топиках лаконично и понятно описать не можете - я уж вообще молчу. Вместо описания того, что вам РЕАЛЬНО надо, вы придумываете несуществующие примеры того, что вам не надо, а через 3 страницы бз всяких угрызений совести сообщаете "а, то я так, для примера привел... мы такое не юзаем, конечно". А нафига ж тогда 3 страницы обсуждали то, что вы не юзаете - не понятно.

Так что, ничему не удивляйтесь, когда обсуждается кот в мешке, а общественности то хвост покажут, то шнурки (а кот тут при чем? да ни при чем - так для примеру).
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079704
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЭто неоправданное (и опасное) усложнение парадигмы.
Вполне возможно, что он просто пытается создать фрейморк, аля js-овских ассоциативных массивов-объектов. Если так, то Дельфи или C# позволили бы ему достичь большей "похожести" с js. А так - разрыв шаблона из-за ярого нежелания использовать нормальные классы с нормальными методами.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079752
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonДля начала с головой будет достаточно перестать превращать с++ в js.

Знаете, в свое время я понял, что очень опасно приводить реальные примеры кода, потому что вместо помощи их станут обсирать чисто ради поднятия ЧСВ. И я стал выкладывать малюсенькие примеры. А теперь я вижу, что совершил грубейшую ошибку, упомянув как метафору js в одном из доводов и теперь весь форум думает, что я хочу превратить c++ в js и теперь каждый хочет мне сообщить, что с++ это не js. После этого случая я теперь и метафоры перестану использовать!!
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079754
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.Dragon2. Результат все-равно на js не похож и не будет. Т.е. не достигнут. А путаница, которая будет мешать вашим "пользователям" достигнута.

Вот я ещё раз эксплиситно всем сообщаю: я не пишу js на C++!!!
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079764
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonВполне возможно, что он просто пытается создать фрейморк, аля js-овских ассоциативных массивов-объектов. Если так, то ....

))))) это уже становится как: Петровна, слышала, что Медведев завел блох в свитере?

Мужики, ну хорош, а...!!)) ну какие нахрен массивы, чё вы придумываете??))) тема совсем о другом
я тему-то как назвал: как спрятать кастинг под капот
при чем тут массивы??? я фигею....
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079768
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixEdd.DragonДля начала с головой будет достаточно перестать превращать с++ в js.

Знаете, в свое время я понял, что очень опасно приводить реальные примеры кода, потому что вместо помощи их станут обсирать чисто ради поднятия ЧСВ. И я стал выкладывать малюсенькие примеры. А теперь я вижу, что совершил грубейшую ошибку, упомянув как метафору js в одном из доводов и теперь весь форум думает, что я хочу превратить c++ в js и теперь каждый хочет мне сообщить, что с++ это не js. После этого случая я теперь и метафоры перестану использовать!!
А я тебе минуту назад хотел посоветовать про Lua почитать. Так что... проехали уже?
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079821
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА я тебе минуту назад хотел посоветовать про Lua почитать. Так что... проехали уже?

Смотря о чем читать. Вы там оба ведь написали: нафиг вообще на плюсах это городить, сделай управление памятью на си. Я подумал, что речь о memcpy()

То есть если вы имеете ввиду взять сорсы луа и там будет функция deep_memcpy() тогда готов ознакомится с вашей идеей
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079855
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixmaytonА я тебе минуту назад хотел посоветовать про Lua почитать. Так что... проехали уже?

Смотря о чем читать. Вы там оба ведь написали: нафиг вообще на плюсах это городить, сделай управление памятью на си. Я подумал, что речь о memcpy()

То есть если вы имеете ввиду взять сорсы луа и там будет функция deep_memcpy() тогда готов ознакомится с вашей идеей
Парень, в Lua нет вообще 90% тех проблем которые та нарисовал.
Это язык с управляемой памятью по принципу GC. Там нет утечек.
Там нет наследования. И нет кастингов со срезкой полей или методов.
Этот язык - это просто клондайк для тебя.

И я тебя нижайше прошу не будоражить форум надуманными проблемами.
Ты вовлёк в дискурс специалистов очень высокого класса (это я тебе
как старый мембер говорю). Но потом раз... и написал сущую
ерунду. Сразу знаешь-ли както разочаровал.

Поэтому не злоупотребляй доверием и приходи сюда с интересными
вопросами. С теми которых нет в справочниках и предварительно подучив основы.

Все неинтересные мы читаем в миллионый раз и не посылаем в ФАК по той
причине что на нашем форуме этого FAQ-а (по С++) просто нет.

Успехов.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079890
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПарень, в Lua нет вообще 90% тех проблем которые та нарисовал.

Не понял фразу...
Подставьте вместо Lua другой язык программирования и какой реакции вы от меня ждете?

Парень, в C# нет вообще 90% тех проблем которые та нарисовал.
Парень, в Java нет вообще 90% тех проблем которые та нарисовал.
Парень, в Python нет вообще 90% тех проблем которые та нарисовал.
Парень, в Javascript нет вообще 90% тех проблем которые та нарисовал.


Или вы думаете, что в нашей команде кто-то станет заниматься биндингом всех с++ классов в подпространство луа??
Задача, которые мы тут обсуждаем касается С++. Причем тут луа-то?? Я и спросил, если в сорсах луа есть что-то, что поможет решить задачу про глубокое копирование, то я посмотрю сорсы, а если нет, то нам луа не нужна как инструмент... мы же не игры пишем...
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079901
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixЗнаете, в свое время я понял, что очень опасно приводить реальные примеры кода
Правильно, нужно создать минимальный демонстрационный образец. Без лишнего наполнения.


Lumixи теперь весь форум думает, что я хочу превратить c++ в js
Дык, развейте домыслы. Сами же оставили пустые пятна для них ))
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079908
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо ничего развивать. Тема подходит к концу и ее пора закрывать.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079909
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixтема совсем о другом
я тему-то как назвал: как спрятать кастинг под капот
Никак.

А та проблема, из которой этот вопрос вырос, вполне возможно решается красиво и элегантно. Как знать.
Тоже самое касается и вопроса "как автоматически подчистить".
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079937
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonLumixЗнаете, в свое время я понял, что очень опасно приводить реальные примеры кода
Правильно, нужно создать минимальный демонстрационный образец. Без лишнего наполнения.

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

Edd.DragonLumixи теперь весь форум думает, что я хочу превратить c++ в js
Дык, развейте домыслы. Сами же оставили пустые пятна для них ))

Позиция исчерпывающе изложена вот тут 13633846
все остальное домыслы и черновиковые мысли...
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079939
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНе надо ничего развивать. Тема подходит к концу и ее пора закрывать.

Согласен.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38079940
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonLumixтема совсем о другом
я тему-то как назвал: как спрятать кастинг под капот
Никак.

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

Решение с кастирующим аксессором обладает 100% элегантностью для нашего кодстайла.

Код: plaintext
1.
2.
3.
shared_ptr<B>& b();
shared_ptr<B>  b(A*);
b() = b(new A);



Такой подкапот 100% подходит.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080137
LumixEdd.Dragonпропущено...

Никак.

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

Решение с кастирующим аксессором обладает 100% элегантностью для нашего кодстайла.

Код: plaintext
1.
2.
3.
shared_ptr<B>& b();
shared_ptr<B>  b(A*);
b() = b(new A);



Такой подкапот 100% подходит.
Вы взяли, как советовал, shared_ptr и тем самым избавились от Memory Leak.
Но до сих пор кастите предка в наследника, т.е. вам в вашем модуле надо будет сверху написать предупреждение: Attention! Undefined behavior of the module.
И в ChangeLog'e добавить это предупреждение.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080145
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixТакой подкапот 100% подходит.
Ну вот я спрашивал - кто все это объявляет и когда/где?

Внутренности функции b ваши?
new A - пишет пользователь? Где чей код? Это так сложно расписать четко и однозначно?

Если этот вопрос не осветить, то все считается вашим. Если ваше - то нет вообще необходимости ни в шаредах, ни в подкапоте - вы просто пишете delete там, где ему место и все.

Так где появляется необходимость во всем этом, и почему вы не можете удалить самостятельно старый объект при добавлении нового? Неужели невозможное объяснить прошу?
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080182
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
реинтерпрет-кастомВы взяли, как советовал, shared_ptr и тем самым избавились от Memory Leak.
Но до сих пор кастите предка в наследника, т.е. вам в вашем модуле надо будет сверху написать предупреждение: Attention! Undefined behavior of the module.
И в ChangeLog'e добавить это предупреждение.

Я его не кастю, потому что не знаю как это сделать. см. задачу про кастинг тут 13634956
Конкретно это решение не про кастинг, а про как спрятать под капот.

Код: plaintext
1.
2.
3.
shared_ptr<B>& b();
shared_ptr<B>  b(A*) { /* я не знаю что тут писать, мне не хватает квалификации */  }
b() = b(new A); // но я точно знаю, что под капот прятать именно так
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080191
Undefined behavior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lumixреинтерпрет-кастомВы взяли, как советовал, shared_ptr и тем самым избавились от Memory Leak.
Но до сих пор кастите предка в наследника, т.е. вам в вашем модуле надо будет сверху написать предупреждение: Attention! Undefined behavior of the module.
И в ChangeLog'e добавить это предупреждение.

Я его не кастю, потому что не знаю как это сделать. см. задачу про кастинг тут 13634956
Конкретно это решение не про кастинг, а про как спрятать под капот.

Код: plaintext
1.
2.
3.
shared_ptr<B>& b();
shared_ptr<B>  b(A*) { /* я не знаю что тут писать, мне не хватает квалификации */  }
b() = b(new A); // но я точно знаю, что под капот прятать именно так


Есть то что вы хотите, а есть реальность - то что происходит.
Конкретно вот в этом коде происходит реинтерпрет каст предка в наследника, как и во всех других ваших вариантах.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080195
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonНу вот я спрашивал - кто все это объявляет и когда/где?

Это объявляет макрос автоматически в месте, где прописывается объект B
чисто условно это место можно назвать файл b.h и b.cpp

Edd.DragonВнутренности функции b ваши?

Наши.

Edd.Dragonnew A - пишет пользователь? Где чей код? Это так сложно расписать четко и однозначно?

Нет, new вызывает код, который нам недоступен. Он расположен внутри динамических библиотек, которые мы используем as is, у нас есть только заголовочные и *.a файлы

мы получаем указатель через некий внешний интерфейс, который я на протяжении этих тем называл вот так

Код: plaintext
1.
2.
A* getA(); // заголовочный файл внешней либы
b() = b(getA()); // строчка в пользовательском коде



Edd.DragonЕсли этот вопрос не осветить, то все считается вашим. Если ваше - то нет вообще необходимости ни в шаредах, ни в подкапоте - вы просто пишете delete там, где ему место и все.

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

Код: plaintext
1.
b(1) = b(2); // раньше b(1) становился утечкой, теперь шареды чистят его сами



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

Потому что пользователям запрещено пользоваться new и delete с целью управления памятью, потому что если им это разрешить, тогда обязательно появятся ошибки из-за невнимательности, а это приведет к падению кода

архитектура системы выстроена таким образом, что у каждого класса автоматически создается аксессор если есть класс A всегда есть A* a() если есть класс Jopa, то всегда есть Jopa* jopa()

(вернее раньше так было, а сейчас все будет на шарепоинтах, но смысл тот же)

раньше можно было вызывать delete a(), а сейчас придется a().reset()
раньше a() = new A; работало, но порождало висяк

если я что-то упустил, сообщите, я добавлю
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080197
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и разумеется из-за чего я вообще пришел на этот форум
Код: plaintext
1.
2.
3.
4.
class B : public A {};
A* a();
B* b();
b() = a();
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080199
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixПотому что пользователям запрещено пользоваться new и delete
Это понятно. А внутри функции b() кому и почему запрещено пользоваться delete? Ровно в том месте, где ты принимаешь новый объект и знаешь, что старый можно удалить (на каком основании - тоже не ясно).
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080200
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Undefined behaviorКонкретно вот в этом коде происходит реинтерпрет каст предка в наследника, как и во всех других ваших вариантах.

Что конкретно означает ваша фраза?? Какие практические выводы я могу сделать из этой фразы?? Мне чем-то эта фраза может помочь в решении задачи про автоматический даункастинг чужих объектов??
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080201
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonLumixПотому что пользователям запрещено пользоваться new и delete
Это понятно. А внутри функции b() кому и почему запрещено пользоваться delete? Ровно в том месте, где ты принимаешь новый объект и знаешь, что старый можно удалить (на каком основании - тоже не ясно).

Edd.Dragon, у нас сейчас нет открытой задачи про удаление объектов. Задача про автоматическое удаление уже давно РЕШЕНА шарепоинтами. Нет уже этой задачи. Она решена. Вопрос закрыт.

Открытым вопрос остается только вот этот:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class A { public: int u1; int u2; };
class B { public: A* a; B() : a(new A){}; };
class C : public B { public: B* b; C() : b(new B){}; };

int main()
{
    C* c = (C*) new B;
    int err = c->b->a->u1; // runtime err
    return 0;
}



Но тема автоматического даункастинга чужих объектов выходит за рамки конкретно этой темы, в которой мы сейчас находимся.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080209
Undefined behavior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LumixUndefined behaviorКонкретно вот в этом коде происходит реинтерпрет каст предка в наследника, как и во всех других ваших вариантах.

Что конкретно означает ваша фраза?? Какие практические выводы я могу сделать из этой фразы?? Мне чем-то эта фраза может помочь в решении задачи про автоматический даункастинг чужих объектов??
Ну прочитайте, что там написано в моей фразе :)
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080213
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixEdd.Dragon, у нас сейчас нет открытой задачи про удаление объектов.
Так все же, кто мешает/мешал удалять старые объекты внутри функции b() вообще без всякого гемороя с автопоинтерами?
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080228
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonLumixEdd.Dragon, у нас сейчас нет открытой задачи про удаление объектов.
Так все же, кто мешает/мешал удалять старые объекты внутри функции b() вообще без всякого гемороя с автопоинтерами?

если честно)))
на тот момент, когда на сцене появились шарепоинты и я ещё не придумал подкапот через аксессор
я просто не знал о таком решении

Код: plaintext
1.
B* b(B* b);



все мое внимание было сосредоточенно на этом варианте

Код: plaintext
1.
b(1) = b(2);



отчасти потому, что я ещё попутно искал решение для

Код: plaintext
1.
b() = a();



но сейчас, с высоты уже изученной темы да, можно сказать, что в принципе можно и без шарепоинтов обойтись

Код: plaintext
1.
B* b(B* b) {  if (globalStore) delete globalStore; return globalStore = b; }
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080230
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
b(1, b(2)); // менее красиво для пользователей
b(1) = b(2); // более круто и более понятно
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080235
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Undefined behaviorЧто конкретно означает ваша фраза?? Какие практические выводы я могу сделать из этой фразы?? Мне чем-то эта фраза может помочь в решении задачи про автоматический даункастинг чужих объектов??
Ну прочитайте, что там написано в моей фразе :)[/quot]

Реально, не сочтите за троллинг, но я не знаю какой можно сделать практический вывод из вашего высказывания...

вот ваша фраза

Конкретно вот в этом коде происходит реинтерпрет каст предка в наследника, как и во всех других ваших вариантах.

Я честно прочитал её 10 раз и не смог сделать никаких выводов. Честно!!
У меня только одна реакция: да, происходит, и чо??
А мне нужен автоматический безопасный даункаст
и как мне его получить???
я не знаю... и наверное ещё долго не узнаю...
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080241
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixно сейчас, с высоты уже изученной темы да, можно сказать, что в принципе можно и без шарепоинтов обойтись

Код: plaintext
1.
B* b(B* b) {  if (globalStore) delete globalStore;



Вот теперь вопрос и для меня закрыт ))
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080243
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а был бы у вас вместо голой функции, ни на что особо не способной, объект - у вас бы ло куда больше свободы и гибкости. И данные в него засунуть можно, и операторы переопределить.
...
Рейтинг: 0 / 0
Как спрятать кастинг под капот
    #38080267
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.Dragonа был бы у вас вместо голой функции, ни на что особо не способной, объект - у вас бы ло куда больше свободы и гибкости. И данные в него засунуть можно, и операторы переопределить.

немного не догоняю...
был бы объект
вы имеете ввиду объект на месте которого сейчас объект под названием shared_ptr или какой объект вы имеете ввиду??


Edd.Dragonголой функции, ни на что особо не способной

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

во-вторых, за каждой этой функцией уже скрывается объект, который мы сами пишем и мы через множественное наследование можем к нему пришивать свои объекты, что мы собственно говоря и делаем

другой вопрос, что может быть вы вообще намекаете на путь, который я ещё не прорабатывал даже на идейной основе, а именно вот так

Код: plaintext
1.
B& b();



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

Код: plaintext
1.
B& b();





фейловая гипотеза оказалась....
ссылки запрещено переназначать, только указатели

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

class A { };

A (*globalStore1) = 0, (*globalStore2) = 0;
A& a1() { return *(globalStore1 = globalStore1 ? globalStore1 : new A()); }
A& a2() { return *(globalStore2 = globalStore2 ? globalStore2 : new A()); }

int main()
{
    a1() = a2();
    cout << (&a1() == &a2()); // false, а должно быть true...
    return 0;
}
...
Рейтинг: 0 / 0
86 сообщений из 86, показаны все 4 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как спрятать кастинг под капот
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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