Здравствуйте!
Скажите, есть ли какой хитрый прием, чтобы вытащить методы агрегированного класса. Например:
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
};
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>
Здравствуйте, Toughpheeckouse, Вы писали:
T>Здравствуйте, Constructor, Вы писали:
C>>Здравствуйте! C>>Скажите, есть ли какой хитрый прием, чтобы вытащить методы агрегированного класса. Например:
T>
T>class B : public A
T>{
T>...
T>};
T>
T>
Смешно, конечно , но с наследованием не получается у меня. Я хотел сделать шаблон, чтобы создавать экземпляры с классом, производным от A. Класс B — MFC-шный и макросы типа IMPLEMENT_DYNCREATE не позволяют писать шаблонный класс. Вот и извращаюсь.
Здравствуйте, 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; }
};
Здравствуйте, 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
};
Здравствуйте, 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 через .
Здравствуйте, 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; }
};
Здравствуйте, Alvin, Вы писали:
A>Пиши генератор — в рамках С++ автоматически это сделать нельзя...
Всем ответившим большое спасибо! Ваши советы мне сильно помогли. Но, задачу свою я так еще не решил...
Может быть, можно хоть макрос какой-нибудь написать типа
class A
{
public:
void f1();
void f2();
};
class B
{
OUTER_METHOD(meth_name);
protected:
A* m_pA;
};
Чтоб для тех методов, которые я хочу вытащить, я написал этот макрос, а он сделал:
Еще можно поступить так. Определить интерфейс, создать реализацию этого интерфейса. Агрегат будет наследовать интерфейс и делегировать его вызовы агрегируемой реализации:
Здравствуйте, MaximE, Вы писали:
ME>Здравствуйте, Constructor, Вы писали:
ME>[]
ME>Еще можно поступить так. Определить интерфейс, создать реализацию этого интерфейса. Агрегат будет наследовать интерфейс и делегировать его вызовы агрегируемой реализации:
[]
Круто! Но дел в том, что агрегат — сторонний класс без виртуальных методов. Мне бы макрос, чтобы вытаскивал методы...
Здравствуйте, Constructor, Вы писали:
C>Здравствуйте, MaximE, Вы писали:
ME>>Здравствуйте, Constructor, Вы писали:
ME>>[]
ME>>Еще можно поступить так. Определить интерфейс, создать реализацию этого интерфейса. Агрегат будет наследовать интерфейс и делегировать его вызовы агрегируемой реализации:
C>[]
C>Круто! Но дел в том, что агрегат — сторонний класс без виртуальных методов. Мне бы макрос, чтобы вытаскивал методы...
Так и здесь агрегат без виртуальных методов. Суть в том, что ты используешь наследника агрегата и интерфейса. Посмотри на код повнимательнее.
Здравствуйте, MaximE, Вы писали:
ME>Здравствуйте, Constructor, Вы писали:
C>>Здравствуйте, MaximE, Вы писали:
ME>>>Здравствуйте, Constructor, Вы писали:
ME>>>[]
ME>>>Еще можно поступить так. Определить интерфейс, создать реализацию этого интерфейса. Агрегат будет наследовать интерфейс и делегировать его вызовы агрегируемой реализации:
C>>[]
C>>Круто! Но дел в том, что агрегат — сторонний класс без виртуальных методов. Мне бы макрос, чтобы вытаскивал методы...
ME>Так и здесь агрегат без виртуальных методов. Суть в том, что ты используешь наследника агрегата и интерфейса. Посмотри на код повнимательнее.
Посмотрел еще 2 раза. Не помогло.
Может быть, договоримся о терминологии. Я называл агрегатом тот класс, объект которого вставлен в другой класс,
class A
{
};
class B
{
A* m_pA;
}
A — агрегат. Как называется B — не знаю. Я не уверен на все сто, что я прав.