Как вытащить методы агрегата?
От: Constructor  
Дата: 12.09.03 10:30
Оценка:
Здравствуйте!
Скажите, есть ли какой хитрый прием, чтобы вытащить методы агрегированного класса. Например:
class A
{
public:
   void f1();
   void f2();
protected:
   void f3();
};

class B
{
protected:
   A* m_pA;
public:
// чтобы каким-нибудь макросом сгенерировались методы
   void f1() { return m_pA->F1(); };
   void f2() { return m_pA->F1(); };
// и притом только public - методы класса A
};
Re: Как вытащить методы агрегата?
От: Constructor  
Дата: 12.09.03 10:36
Оценка:
Опечатка

C>
C>class B
C>{
C>protected:
C>   A* m_pA;
C>public:
C>// чтобы каким-нибудь макросом сгенерировались методы
C>   void f1() { return m_pA->f1(); };
C>   void f2() { return m_pA->f2(); };
C>// и притом только public - методы класса A
C>};
C>
Re: Как вытащить методы агрегата?
От: Toughpheeckouse Россия  
Дата: 12.09.03 10:50
Оценка:
Здравствуйте, Constructor, Вы писали:

C>Здравствуйте!

C>Скажите, есть ли какой хитрый прием, чтобы вытащить методы агрегированного класса. Например:

class B : public A
{
...
};


Думайте сами, решайте сами...
Re[2]: Как вытащить методы агрегата?
От: Constructor  
Дата: 12.09.03 11:00
Оценка:
Здравствуйте, Toughpheeckouse, Вы писали:

T>Здравствуйте, Constructor, Вы писали:


C>>Здравствуйте!

C>>Скажите, есть ли какой хитрый прием, чтобы вытащить методы агрегированного класса. Например:

T>
T>class B : public A
T>{
T>...
T>};
T>


T>


Смешно, конечно , но с наследованием не получается у меня. Я хотел сделать шаблон, чтобы создавать экземпляры с классом, производным от A. Класс B — MFC-шный и макросы типа IMPLEMENT_DYNCREATE не позволяют писать шаблонный класс. Вот и извращаюсь.
Re: Как вытащить методы агрегата?
От: _nn_  
Дата: 12.09.03 11:29
Оценка:
Здравствуйте, Constructor, Вы писали:

C>Здравствуйте!

C>Скажите, есть ли какой хитрый прием, чтобы вытащить методы агрегированного класса. Например:
C>
C>class A
C>{
C>public:
C>   void f1();
C>   void f2();
C>protected:
C>   void f3();
C>};

C>class B
C>{
C>protected:
C>   A* m_pA;
C>public:
C>// чтобы каким-нибудь макросом сгенерировались методы
C>   void f1() { return m_pA->F1(); };
C>   void f2() { return m_pA->F1(); };
C>// и притом только public - методы класса A
C>};
C>


Чем такое решение не подойдет ?
class B
{
protected:
A* m_pA;
public:
const A* GetA() { return m_pA; }
};
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Как вытащить методы агрегата?
От: Igor Karablin Россия  
Дата: 12.09.03 11:47
Оценка:
Здравствуйте, Constructor, Вы писали:

C>Здравствуйте!

C>Скажите, есть ли какой хитрый прием, чтобы вытащить методы агрегированного класса. Например:

class A
{
public:
   void f1();
   void f2();
protected:
   void f3();
};

class B : public A
{
protected:
//   A* m_pA;
public:
// чтобы каким-нибудь макросом сгенерировались методы
//   void f1() { return m_pA->f1(); };
//   void f2() { return m_pA->f2(); };
// и притом только public - методы класса A
};


Выделено жирным
Re: Как вытащить методы агрегата?
От: e-Xecutor Россия  
Дата: 12.09.03 12:07
Оценка:
Здравствуйте, Constructor, Вы писали:

C>Здравствуйте!

C>Скажите, есть ли какой хитрый прием, чтобы вытащить методы агрегированного класса. Например:
C>
C>class A
C>{
C>public:
C>   void f1();
C>   void f2();
C>protected:
C>   void f3();
C>};

C>class B
C>{
C>protected:
C>   A* m_pA;
C>public:

  A* operator->(){return m_pA;}

C>// чтобы каким-нибудь макросом сгенерировались методы
C>   void f1() { return m_pA->F1(); };
C>   void f2() { return m_pA->F1(); };
C>// и притом только public - методы класса A
C>};
C>


например так

тогда методы A будут вызываться через ->, а методы B через .
Re: Как вытащить методы агрегата?
От: Alvin  
Дата: 12.09.03 12:09
Оценка:
Здравствуйте, Constructor, Вы писали:

C>Здравствуйте!

C>Скажите, есть ли какой хитрый прием, чтобы вытащить методы агрегированного класса.

Пиши генератор — в рамках С++ автоматически это сделать нельзя...
Re[2]: Как вытащить методы агрегата?
От: _nn_  
Дата: 12.09.03 14:02
Оценка:
Здравствуйте, e-Xecutor, Вы писали:

EX>Здравствуйте, Constructor, Вы писали:


C>>Здравствуйте!

C>>Скажите, есть ли какой хитрый прием, чтобы вытащить методы агрегированного класса. Например:
C>>
C>>class A
C>>{
C>>public:
C>>   void f1();
C>>   void f2();
C>>protected:
C>>   void f3();
C>>};

C>>class B
C>>{
C>>protected:
C>>   A* m_pA;
C>>public:
EX>
EX>  A* operator->(){return m_pA;}
EX>
C>>// чтобы каким-нибудь макросом сгенерировались методы
C>>   void f1() { return m_pA->F1(); };
C>>   void f2() { return m_pA->F1(); };
C>>// и притом только public - методы класса A
C>>};
C>>


EX>например так


EX>тогда методы A будут вызываться через ->, а методы B через .


Может лучше так ?
class A
{
public:
   void f1();
   void f2();
protected:
   void f3();
};

class B
{
protected:
   A* m_pA;
public:
operator A*() { return m_pA; }
};
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Как вытащить методы агрегата?
От: Constructor  
Дата: 19.09.03 11:06
Оценка:
Здравствуйте, Alvin, Вы писали:

A>Пиши генератор — в рамках С++ автоматически это сделать нельзя...


Всем ответившим большое спасибо! Ваши советы мне сильно помогли. Но, задачу свою я так еще не решил...
Может быть, можно хоть макрос какой-нибудь написать типа
class A
{
public:
    void f1();
    void f2();
};

class B
{
    OUTER_METHOD(meth_name);
protected:
    A* m_pA;
};


Чтоб для тех методов, которые я хочу вытащить, я написал этот макрос, а он сделал:
B::meth_name
{
    return m_pA->meth_name
}
Re[3]: Как вытащить методы агрегата?
От: MaximE Великобритания  
Дата: 19.09.03 12:10
Оценка:
Здравствуйте, Constructor, Вы писали:

[]

Еще можно поступить так. Определить интерфейс, создать реализацию этого интерфейса. Агрегат будет наследовать интерфейс и делегировать его вызовы агрегируемой реализации:

////////////////////////////////////////////////////////////////////////////////

#include <iostream>

////////////////////////////////////////////////////////////////////////////////

// интерфейс 
struct some_interface
{
    virtual void foo() = 0;
    virtual void bar() = 0;
};

////////////////////////////////////////////////////////////////////////////////

// реализация интерфейса
struct some_interface_impl : some_interface
{
    void foo() { std::cout << "some_interface_impl::foo()\n"; }
    void bar() { std::cout << "some_interface_impl::bar()\n"; }
};

////////////////////////////////////////////////////////////////////////////////

// делегирует вызовы интерфейса члену
template<class Base, class Implementor, Implementor Base::*member>
struct redirect_some_interface_to_member : Base, some_interface
{
    void foo() { (this->*member).foo(); }
    void bar() { (this->*member).bar(); }
};

////////////////////////////////////////////////////////////////////////////////

// агрегат
class some_aggregate
{
private:
    // агрегирует реализацию
    some_interface_impl implementor_;

    // нужно, чтобы отложить взятие адреса члена внутри определения класса
    template<class T>
    struct some_aggregate_typedef
    {
        typedef redirect_some_interface_to_member
        <
            T,
            some_interface_impl,
            &T::implementor_
        > type;
    };

    friend struct some_aggregate_typedef<some_aggregate>;

public:
    typedef some_aggregate_typedef<some_aggregate>::type type;
};

////////////////////////////////////////////////////////////////////////////////

int main()
{
    some_aggregate::type a;

    a.foo();
    a.bar();

    return 0;
}

////////////////////////////////////////////////////////////////////////////////
Re[4]: Как вытащить методы агрегата?
От: Constructor  
Дата: 19.09.03 12:17
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, Constructor, Вы писали:


ME>[]


ME>Еще можно поступить так. Определить интерфейс, создать реализацию этого интерфейса. Агрегат будет наследовать интерфейс и делегировать его вызовы агрегируемой реализации:


[]

Круто! Но дел в том, что агрегат — сторонний класс без виртуальных методов. Мне бы макрос, чтобы вытаскивал методы...
Re[5]: Как вытащить методы агрегата?
От: MaximE Великобритания  
Дата: 19.09.03 12:19
Оценка:
Здравствуйте, Constructor, Вы писали:

C>Здравствуйте, MaximE, Вы писали:


ME>>Здравствуйте, Constructor, Вы писали:


ME>>[]


ME>>Еще можно поступить так. Определить интерфейс, создать реализацию этого интерфейса. Агрегат будет наследовать интерфейс и делегировать его вызовы агрегируемой реализации:


C>[]


C>Круто! Но дел в том, что агрегат — сторонний класс без виртуальных методов. Мне бы макрос, чтобы вытаскивал методы...


Так и здесь агрегат без виртуальных методов. Суть в том, что ты используешь наследника агрегата и интерфейса. Посмотри на код повнимательнее.
Re[6]: Как вытащить методы агрегата?
От: Constructor  
Дата: 19.09.03 12:46
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, Constructor, Вы писали:


C>>Здравствуйте, MaximE, Вы писали:


ME>>>Здравствуйте, Constructor, Вы писали:


ME>>>[]


ME>>>Еще можно поступить так. Определить интерфейс, создать реализацию этого интерфейса. Агрегат будет наследовать интерфейс и делегировать его вызовы агрегируемой реализации:


C>>[]


C>>Круто! Но дел в том, что агрегат — сторонний класс без виртуальных методов. Мне бы макрос, чтобы вытаскивал методы...


ME>Так и здесь агрегат без виртуальных методов. Суть в том, что ты используешь наследника агрегата и интерфейса. Посмотри на код повнимательнее.


Посмотрел еще 2 раза. Не помогло.
Может быть, договоримся о терминологии. Я называл агрегатом тот класс, объект которого вставлен в другой класс,

class A
{
};

class B
{
   A* m_pA;
}


A — агрегат. Как называется B — не знаю. Я не уверен на все сто, что я прав.
Re[7]: Как вытащить методы агрегата?
От: MaximE Великобритания  
Дата: 19.09.03 13:13
Оценка:
Здравствуйте, Constructor, Вы писали:

[]

C>Может быть, договоримся о терминологии. Я называл агрегатом тот класс, объект которого вставлен в другой класс,


C>
C>class A
C>{
C>};

C>class B
C>{
C>   A* m_pA;
C>}
C>


C>A — агрегат. Как называется B — не знаю. Я не уверен на все сто, что я прав.


Я называл B — агрегатом, А — агрегируемым.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.