LINUX.ORG.RU

В этой постановке void*, или указатель на класс-маркер (пустой класс, от которого наследуются все нужные классы). Лучше уточните постановку.

Legioner ★★★★★
()

void * кажется то. Проверю.

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

В этой постановке void*,

Не пойму как это задействовать.

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

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

То есть объект любого из этих классов как универсальный указатель? Вроде бы ясно. Спасибо.

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

да - указатель на любой объект класса ClassA и ClassB кастится в I_BaseClass*( родительский интерфейс ) и передается по месту назначения, если в том месте, где получен I_BaseClass*, не хватает методов этого интерфейса, то делается, например, dynamic_cast, чтоб получить указатель на другой интерфейс или класс

lester ★★★★
()

очень куцо описана задача, ниче не ясно

вполне может быть, что тебе вообще не нужен такой указатель (хинт: std::cout << my_object; ) или если он тебе нужен, то пиши подробнее.

если надо сделать один интерфейс для классов вообще из разных иерархий, у которых общее в том, что они например имеют метод int Class::get_count(), то это можно сделать и без динамик_каст-ов (но с виртуальными функциями)

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

Ну, например есть функция, которая выполняет какую-то работу с классом, который получает в виде аргумента. При этом не знает, класс это A или B. Но в обоих классах есть к примеру функция set(int a), и её нужно обработать\не обработать своему в зависимости от значения булевых флагов в том же классе.

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

В этом случае правильный совет - произвести класс A и класс B от некоего общего предка C. При чем этот общий предок может быть вообще чисто абстрактным классом, объявляющим сам интерфейс: set(int a) ну и функции для чтения этих самых «булевых флагов». В твою основную функцию будет передаваться указатель на класс-предок C. В общем-то все это уже раза два или три написали выше.

class C {
public:
    virtual void set(int a) = 0;
    virtual bool getFlagA() const = 0;
    virtual bool getFlagB() const = 0;
};


class A : public C {
public:
    void set(int a) { /* Реализация функции */ }
    bool getFlagA() const { /* Реализация функции */ } 
    bool getFlagB() const { /* Реализация функции */ } 
};


class B : public C {
public:
    void set(int a) { /* Реализация функции */ }
    bool getFlagA() const { /* Реализация функции */ } 
    bool getFlagB() const { /* Реализация функции */ } 
};


/* Ну и собственно сама функция (абстрактный пример, как я понял задачу): */
void magicFunction(C *object)
{
    if(object->getFlagA() && object->getFlagB())
        object->set(10);
}

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

Под эту формулировку задачи может ещё подойти темплейтная функция. Если правильно понял.

template <class A>
void magicFunction(A &obj)
{
	if(obj.getFlagA() && obj.getFlagB()) 
    	obj.set(10); 
}

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

cкуууучно

когда классы А и В будут чужие, да еще в разных иерархиях — загляни снова :-)

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

Черт побери, метки о закрытии треда!

ужасно на самом деле. треды на ЛОРе живут собственной жизнью, им нет дела до мнения топикстартера

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

А мне импонирует. Если тс не дурак, и ясно задал вопрос в названии, сразу видно, получил ли он ответ или нет.

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