LINUX.ORG.RU

Пустой класс. Ну вот совершенно пустой. Может стоит как-то иначе?

 , ,


0

3

Представьте себе ситуацию: есть ящики, в ящиках могут быть гвозди, бананы или коты. Очевидно что между гвоздями, бананами и котами общего ничего нет. А ящики стандартные и должны хранить указатель на содержимое.
Ну и что я делаю? Я создаю класс «содержимое», от которого будут наследоваться гвозди, бананы и коты.
Вот только эти классы настолько разные, что в базовый класс вообще нечего вынести.
Такой вот совершенно пустой класс, нужный лишь для приведения типов.
Сижу вот ржу.
Работать-то будет конечно, но может Чаушеску (или как там его) придумал какой-то более элегантный финт ушами? А то чувствую себя явистом с их любовью к иногда странной иерархии.

★★☆

Последнее исправление: Stahl (всего исправлений: 1)

Я не понял, у тебя есть три типа объектов, не имеющих между собой ничего общего. Зачем их объединять в иерархию? Ну пусть у тебя будет

std::vector<Nail>;
std::vector<Cat>;
std::vector<ChtoUTebyaTamEsheZaHuinya>;
DELIRIUM ☆☆☆☆☆
()
using Content = void *;

struct Cat {};
struct Banana {};
struct Nail {};

int main() {
	Cat cat;
	Banana banana;
	Nail nail;
	std::vector<Content> things({&cat, &banana, &nail});
}
anonymous
()

Если тебе не нужен общий интерфейс для работы с этими классами, то как то я не вижу смысла иметь отдельный класс. О каком приведении типов тут может идти речь, если нет общего интерфейса? Приводи к void*, потом обратно, если тебе принципиально нужно объекты этих классов иметь в неком векторе.

c3ph
()

А методы add(кот) или get(номер банана) не нужны?

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

Тогда вообще зачем оно нужно, если это замкнутые ящики для самих себя?!

Serg_HIS
()
Ответ на: комментарий от Serg_HIS

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

anonymous
()
Ответ на: комментарий от anonymous

using Content = void *;

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

anonymous
()
Ответ на: комментарий от intelfx

Если включен RTTI, то базовый класс _уже_ хранит данные о типе производного.

Только если конечный класс получается с виртуальными составляющими.

anonymous
()

Переходи на Go. Будешь хранить гвозди, хлеб и колбасу как пустые интерфейсы interface{}.

rupert ★★★★★
()

Ещё вариант:

using box_item = std::variant<nail, banana, kitten>;
using box_container = std::vector<box_item>;
rupert ★★★★★
()

А разве не проще написать иерархию ящиков, которые ещё и экстракт сами умеют? Ну т.е. BaseBox, от которого наследован CatBox, NailBox, BananaBox, HumanBox и т.д.

robus ★★★★★
()
Ответ на: комментарий от robus

Ящик? Экстракт? Каким макаром это относится к ящику? ООП это не только про иерархию и инкапсуляцию, но и про здравый смысл (о последней явисты часто забывают предпочитая первую часть)

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

ООП это не только про иерархию и инкапсуляцию, но и про здравый смысл

ООП подразумевает инкапсуляцию, наследование и полиморфизм. Интуитивно понятный «здравый смысл» там ни при чём — его может по просту не быть в моделируемом PD (про сепульки тоже можно построить объектную модель).

Ну предположим, что он там есть. Тогда что это за объект в «котоэкстрактор»?

P.S. Здравый смысл также подсказывает, что не стоит котов хранить также как гвозди.

robus ★★★★★
()
Ответ на: комментарий от robus

В эти же ящики, как базовый метод в интерфейс можно вписать и processing()

Не просто же хранить это нужно, а как-то использовать?

Serg_HIS
()

Можно сделать и по другому.

Ящик сделать один универсальный, только с методом положить и взять и чего там ещё хочется, а вот плодить иерархию от базового класса для элементов содержимого: item ->(кот, банан, гвоздь, ...)

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

при вызове box.add(item) - ящик автоматически сможет разобраться, как положить туда кота рядом с гвоздём, вызывая методы и параметры из самих объектов, которые нужно складывать в ящик.

Почти тоже самое что и наследование ящиков - но универсальность больше.

Serg_HIS
()
Ответ на: комментарий от Serg_HIS

Тогда вообще зачем оно нужно, если это замкнутые ящики для самих себя?!

Может суть именно в самом «хранении», например очередь для передачи объектов в поток.

no-such-file ★★★★★
()
Ответ на: комментарий от rupert

как пустые интерфейсы interface{}

Ну так ТС и сделал себе interface{}.

no-such-file ★★★★★
()

Так если у тебя задача «только хранить» (aka завскладом), то зачем тебе знть о типах? Храни void* (ничем не хуже пустого класса родителя).

KennyMinigun ★★★★★
()

По идее даже класс не нужен а интерфейс, реализующий хранение, типа достать из ящика, положить в ящик, описание, и тп. Я конечно в C++ ни ухом ни рылом, но начал почитывать... :)

slapin ★★★★★
()

аботать-то будет конечно, но может Чаушеску (или как там его) придумал какой-то более элегантный финт ушами?

std/boost::any

annulen ★★★★★
()
Ответ на: комментарий от no-such-file

Ну деструктор-то в 99.9% случаев виртуальный.

Конечно же, нет. Как минимум весь STL не «|виртуальный».

anonymous
()

Всё нормально, вообще. Тайпчек это хорошо.

mersinvald ★★★★★
()

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

anonymous
()

Непонятно чего хочет тс: подискутировать или получить решение... бери интерфейс icontent и вперед котов с гвоздями делать...

jo_b1ack ★★★★★
()
Ответ на: комментарий от system-root

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

anonymous
()
Ответ на: комментарий от ya-betmen

я тебе объяснил. Нахрена плодить сущности?

anonymous
()

Вот только эти классы настолько разные, что в базовый класс вообще нечего вынести.

Зависит от задачи, «подумай немного головой». Например «стоимость содержимого».

superuser ★★★★☆
()

забавные у плюсовиков вопросы и ответы

anonymous
()

Очевидно что между гвоздями, бананами и котами общего ничего нет

срочно категорий проси отсыпать себе.

ибо всё 3 материальные объекты как минимум , а уж более конкретные общности у этих 3ёх ваще мириады.

всёж Стауструп с Дизайном и Эволюцией очень очень годняшка.

anonymous
()
Ответ на: комментарий от DarkEld3r

Ну, всмысле, что без хаков. Так как в языке нет дженериков, interface{} является единственным способом обобщенной манипуляции объектами разных типов.

rupert ★★★★★
()

Ну может глупость скажу, но все же: а отдельные классы для котов и гвоздей реально нужны? У них какое-то состояние есть, которое нужно отслеживать?

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

А если нет, то может вообще обойтись чем-то типа?

class Box {
 long Quantity;
 string Type;
}
Midael ★★★★★
()
Последнее исправление: Midael (всего исправлений: 2)

сколько с++ боли в этих строках... жавистом он себя чувствует, лол

anonymous
()
Ответ на: комментарий от Softwayer

ну как можно функциональщину за «нормальный язык» принимать.

ну это же ужас-ужас-ужас. я жене делаю лабы по лиспу, и офигеваю. насколько сложно сделать самые примитивные вещи, которые я на Си за полдня напишу пусть даже за 7500 строк. А тут сидишь и гадаешь- ах ты ж сраная срань, что тебе на этот раз надо.

простые вещи в С и С++ в лиспе превращаются в ад и боль.

ckotinko ☆☆☆
()
Ответ на: комментарий от ckotinko

А ты не путай простоту и синдром утенка. Например, покажи кресты тому кто учился на лиспе или ML - выслушаешь много интересного.

anonymous
()
Ответ на: комментарий от anonymous

А ты не путай простоту и синдром утенка.

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

DarkEld3r ★★★★★
()
Ответ на: комментарий от ckotinko

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

Есть, конечно, и вещи, с которыми наоборот — сегфолт, например, в хаскеле получить и правда непросто, разве что через FFI.

Softwayer ★★
()
Ответ на: комментарий от Softwayer

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

anonymous
()

Вот только эти классы настолько разные, что в базовый класс вообще нечего вынести.
Такой вот совершенно пустой класс, нужный лишь для приведения типов.

Случайно на интерфейсный класс не похоже? Если да, то это нормально. :)

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от anonymous

Ну раз анонимус не осилил — наверное, так и есть.

Softwayer ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.