Потомок не приводится к предку

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Код: Выделить всё

class TInputingString : private std::u32string
{
 ...
 public:
 operator std::u32string ()
 {
  return (*((std::u32string*)this));
 }
...
};
...
class TUStringsArray
{
 ...
 public:
 ...
 TUStringsArray &operator += (const std::u32string &String)
 {
  ...
 }
 ... 
};
...
TUStringsArray ChartPolylogue;
TInputingString ChartLine;
, ругается на строку

Код: Выделить всё

ChartPolylogue+=Gamer.GetName()+std::u32string(U">")+(std::u32string)ChartLine;
, пишет, что
error: 'std::basic_string<char32_t>' is an inaccessible base of 'TInputingString'|
. Как с этим бороться?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

Объясни, зачем ты сделал private наследование, а потом всё равно пытаешь открыть внешнему коду всё представление базового класса через оператор приведения к типу? Ровно того же ты добьёшься, убрав оператор и сделав public наследование. Но только всё работать будет.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Затем, что как раз это писано по-еврейски, а не по-венгерски. Мне надо лишь двух местах передавать std::u32string, а в остальных обращаться к членам предка не напрямую, а из тел операторов-членов потомка и его же функций-членов. Поэтому и private.
Понимание инкапсуляции и сокрытия данных отсутствует напрочь...
Это из чего такой вывод? Оператор приведения открыт.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):Это из чего такой вывод? Оператор приведения открыт.
А из того, что private наследование делают для того, чтобы снаружи не были доступны методы базового класса, при попытке их вызывать у потомка. Но ты при этом делаешь оператор приведения к типу в открытой области, тем самым полностью разрушая задуманное сокрытие. Это всё равно, что повесить замок на дверь, а рядом с дверью пробить в стене дыру в человеческий рост. Спрашивается, зачем нужна дыра, если есть дверь и зачем нужен замок, если есть дыра?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Ну не совсем так. Это с дороги два съезда, на одном висит "кирпич" и приписка "кроме таких то" и оба съезда ведут на дороги, которые дальше соединяются.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

Есть одно очень простое правило:

Всё, что пользователь может сделать, он обязательно сделает.

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

Именно поэтому я написал, что ты не понимаешь, что такое инкапсуляция...
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

В реале может так бы и получилось, но компилятор - не такой пофигист. Ладно, аналогия ещё ближе. Две двери, на одной табличка "Не хочешь - не входи", а на другой ничего не написано, но эта вторая дверь ведёт в обходной коридор, в котором каждого останавливают и заставляют кое что сделать и только потом он ведёт за вторую дверь. Мне надо гарантировать, что любое обращение функций к членам предка будет перехвачено, если иное не было явно объявлено. Но в то же время в двух местах требуется отмена такого поведения для последующего прямого обращения к членам предка. Если я пропишу паблик-наследование, а потом забуду переопределить член, то получится прямое обращение к члену предка. Если же я явно привожу к предку, то абсолютно логично, что после этого обращения к членам предка должны быть прямыми.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

Пиши такие программы, которые тебе хочется писать. Самое главное - никому и никогда их не показывай. И не спрашивай почему, так как ответ тебя обидит.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить