Автоматическое приведение редукса - PullRequest
0 голосов
/ 24 сентября 2008

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

У меня есть класс с именем P, который выполняет какую-то определенную цель. У меня также есть PW, которая выполняет определенные функции для P. В PW нет переменных-членов, только функции-члены.

Из этого описания вы предполагаете, что код будет выглядеть следующим образом:

class P
{
public:
    void a( );
};

class PW
{
public:
    PW( const P& p ) : p( p ) { }
    void b( );
    P& p;
};

class C
{
public:
    P GetP( ) const { return p; }   
private:
    P p;
};

// ...
    PW& p = c.GetP( ); // valid
// ...

Однако это поднимает проблему. Я не могу вызывать функции P без косвенного обращения.

// ...
    p->p->a( )
// ...

То, что я хотел бы сделать, это вызвать p-> a () и автоматически определить, что я хотел бы вызвать функцию-член P.

Также наличие члена PW с именем a на самом деле не масштабируется - что, если я добавлю (или удалю) другую функцию в P - это нужно будет добавить (или удалить) в PW.

Ответы [ 3 ]

2 голосов
/ 24 сентября 2008

Вы можете попробовать переопределить оператор * и оператор->, чтобы вернуть доступ к встроенному p. Нечто подобное может сработать:

class P
{
  public:
    void a( ) { std::cout << "a" << std::endl; }
};

class PW
{
  public:
    PW(P& p) : p(p) { }

    void b( ) { std::cout << "b" << std::endl; }

    P & operator*()  { return p;  }
    P * operator->() { return &p; }

  private:
    P & p;
};

class C
{
  public:
    P & getP() { return p; }

  private:
    P p;
};


int main()
{
  C c;
  PW pw(c.getP());

  (*pw).a();
  pw->a();
  pw.b();

  return EXIT_SUCCESS;
}

Этот код печатает

a
a
b

Однако этот метод может сбить пользователя с толку, поскольку семантика оператора * и operator-> становится немного запутанной.

1 голос
/ 24 сентября 2008

Если вы сделаете P суперклассом для PW, как вы это делали в предыдущем вопросе, вы можете вызвать p-> a (), и он будет направлен на класс P. Похоже, вы уже рассмотрели и отвергли это, судя по этому вопросу. Если да, не могли бы вы уточнить, почему это не сработает для вас?

0 голосов
/ 24 сентября 2008

Я думаю, вам нужно подумать, какие существуют отношения между PW и P.

Это отношения? Являются ли случаи PW экземплярами P? Тогда имело бы смысл наследовать PW от P.

Это отношения? Тогда вам следует придерживаться сдерживания и мириться с синтаксическим неудобством.

Между прочим, обычно не стоит раскрывать неконстантную ссылку на переменную-член в открытом интерфейсе класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...