LINUX.ORG.RU

Оцените насолько правильно


0

0

Есть абстрактный класс:

class A{
public: virtual int foo() = 0;
}

есть потомки (соответственно B и C)

class B{
public: int foo(){};
}

тоже самое с С. Задача объеденить В и С в одну стркутуру, и взависимости от объекта выполнить функцию foo. Вот так у меня:
инициализация:
target = malloc (sizeof(A)*2);
ob_B = new B;
ob_C = new C;
target = ob_B;
* ( &target + sizeof(A)) = ob_C;

уже обращение:
((А*) target)->foo();
( (A*) * ( &target + sizeof(A)) )->foo();

Соотвтетственно ед. отличие между А и В и С - эт функция foo(). Вопрос: насколько мой вариант кашерен, грамотен, правилен, возможно глюкавен и т.д. Особо интересует (возможность)/(не возможность) сегфолта


★★

да, он кашерен. от слова каша.

dilmah ★★★★★
()

во первых у тебя здесь просто ошибки.

target = malloc (sizeof(A)*2); target = ob_B;

несоответствие типов.

Во вторых, гарантии что sizeof(B) == sizeof(A) вообще говоря нет.

В третьих, непонятно зачем всю эту кашу варить

dilmah ★★★★★
()

Некошерен. За такое следует наказывать.

Какую задачу ты пытаешься решить - тоже непонятно.

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

>В третьих, непонятно зачем всю эту кашу варить

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

>target = malloc (sizeof(A)*2); target = ob_B; несоответствие типов.

приведите контр-пример коллекции потомков абстрактного класса

>Во вторых, гарантии что sizeof(B) == sizeof(A) вообще говоря нет.

вот наподобие этого и хотел услышать, но как я писал выше: "ед. отличие между А и В и С - эт функция foo()". Как я понимаю описание методов не хранится в том же месте, что я выделяю malloc'ом, если я ошибаюсь - прошу линк на материал. Если какая-то другая ошибка - просьба её озвучить.

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

> приведите контр-пример коллекции потомков абстрактного класса

так ob_B это указатель или объект?

обычно коллекции хранят в виде контейнера указателей на базовый класс

> вот наподобие этого и хотел услышать, но как я писал выше: "ед. отличие между А и В и С - эт функция foo()". Как я понимаю описание методов не хранится в том же месте, что я выделяю malloc'ом, если я ошибаюсь - прошу линк на материал. Если какая-то другая ошибка - просьба её озвучить.

пофиг чем они отличаются. Гарантии нет и все. Компилятор, если ему заблагорассудится, может хранить имя класса в виде стринга внутри объекта.

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

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

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

> "ед. отличие между А и В и С - эт функция foo()"

При эволюции программы кто-то добавляет поле, и ты приплыл.

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

>Может сделаешь массив указателей на A?

блин сори, вместо: target = malloc (sizeof(A)*2); ob_B = new B; ob_C = new C;

читать: void * target = malloc (sizeof(A)*2); B * ob_B = new B; C * ob_C = new C;

именно этот массив и хочу сделать. И вопрос: возможно ли такое

>Какая конечная цель?

опишу подробнее. Есть порядка 20 объектов("шаблонов") (в дальнейшем может больше, может меньше), с каждым "шаблоном" ассоциированна УНИКАЛЬНАЯ функция. Все шаблоны задаются на этапе компиляции. Задача определить если шаблон идентичен заданной строке - выполнить соответствующее действие. Тут я вижу три варианта выполнения. Два в лоб: написать гигантскую функцию, отрабатывающую функцию; или каждый объект проверять на соотвтетствие шаблону и потом выполнять функцию. А можно создать объект-коллекцию, добавив в нее инициализированный до этого шаблон - и работать (проверять на соответствие шаблону) в цикле.

>При эволюции программы кто-то добавляет поле, и ты приплыл.

вот еслиб было шаблонов штуки 3-4. то так бы не извращался

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

> читать: void * target = malloc (sizeof(A)*2);

может таки sizeof(A*)*2

тогда проблемы нет.

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

инициализация:

std::vector<A*> a; a.push_back(new B()); a.push_back(new C());

или

std::vector<A*> a; a.reserve(10); a[0] = new B(); a[1] = new B(); a[2] = new C(); a[3] = new B();

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

>std::vector<A*> a;

блин сорри =) вопрос снимается. я до начала топика пытался std::vector<A> a; - ошибка вылезала, до указателей в векторе не додумалси =)

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

> ошибка вылезала, до указателей в векторе не додумалси =)

Судя по вопросу, ты вообще никаких книжек по C++ никогда не открывал, а это зря: нельзя до всего додуматься самостоятельно, потому что жизнь коротка.

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

>Есть порядка 20 объектов("шаблонов") (в дальнейшем может больше, может меньше), с каждым "шаблоном" ассоциированна УНИКАЛЬНАЯ функция. Все шаблоны задаются на этапе компиляции. Задача определить если шаблон идентичен заданной строке - выполнить соответствующее действие.

заюзать std::map < std::string, A * > либо если надо по строке создавать нужный класс и еще чего-то делать, то читать про шаблон Factory у Александреску.

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