Re: Приведение типа указателя
От: Erop Россия  
Дата: 06.03.08 00:08
Оценка:
Здравствуйте, Eldar9x, Вы писали:

E>Каким образом привести указатель к типу B*?


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

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

Я тогда немного переформулирую задачу:
class MyRealClass {
    // Тут данные и методы, в том числе
    void Method1();
    void Method2();
};


Теперь заводим интерфейс, через который мы планируем иметь доступ к нашему объекту:
struct IMyMethod {
    virtual ~IMyMethod() {};
    virtual void Method() = 0;
};


И заводим две его реализации:
struct MyMethod1 : IMyMethod, virtual MyRealClass {
    void Method() { Method1(); }
    IMyMethod* GetMethod1() { return this; }
};

struct MyMethod2 : IMyMethod, virtual MyRealClass {
    void Method() { Method2(); }
    IMyMethod* GetMethod2() { return this; }
};


Ну и теперь рожаем "переключаемый" объект
struct MyClass : MyMethod1, MyMethod2 { 
};


Ну, или, чуть удобнее:
class MyRealClass {
    // Тут данные и методы, в том числе
    void Method1();
    void Method2();
};

struct IMyMethod {
    virtual ~IMyMethod() {}
    virtual void Method() = 0;
    
    virtual IMyMethod* GetMethod1() = 0;
    virtual IMyMethod* GetMethod2() = 0;
};

struct MyMethod1 : IMyMethod, virtual MyRealClass {
    virtual void Method() { Method1(); }
};

struct MyMethod2 : IMyMethod, virtual MyRealClass {
    virtual void Method() { Method2(); }
};

struct MyClass : MyMethod1, MyMethod2 {
    virtual IMyMethod* GetMethod1() { return static_cast<MyMethod1*>( this ); }
    virtual IMyMethod* GetMethod2() { return static_cast<MyMethod2*>( this ); }
};


Ну и используем:
    IMyMethod* p = ( new MyClass )->GetMethod1();
    p->Method(); // Method1
    p = p->GetMethod2();
    p->Method(); // Method2
    delete p; // Всё хорошо, ничего не утекает :)
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.