Pergunta

Depois que eu bagunçou a descrição do meu post anterior sobre isso eu tenho sentou-se e tentou transmitir a minha exata intenção.

Eu tenho uma classe chamada P que realiza um propósito distinto. Eu também tenho PW que realizar algum propósito distinto em P. PW não tem variáveis ??de membro, apenas funções de membro.

A partir dessa descrição que iria assumir que o código seguiria assim:

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
// ...

No entanto, que traz à tona um problema. Eu não posso chamar as funções de P, sem dissimulação em todos os lugares.

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

O que eu gostaria de fazer é chamar p> a () e tê-lo automaticamente determinar que eu gostaria de chamar a função de membro de P.

Também ter um membro da PW chamado a realmente não escala - o que se eu adicionar (ou remover) uma outra função para P - este terá de ser adicionado (ou removido) para PW.

Foi útil?

Solução

Você poderia tentar substituir operador * e do operador> para acesso retorno ao p incorporado. Algo como isso poderia fazer o truque:

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;
}

Esta impressões de código

a
a
b

No entanto, este método pode confundir o usuário desde a semântica do operador * e da operadora> torna-se um pouco confuso.

Outras dicas

Se você fizer P uma superclasse para PW, como você fez na sua pergunta anterior, você poderia chamar p> a () e ele iria dirigir a classe P. Parece que você já considerou e rejeitou isso, porém, a julgar esta questão. Se assim for, você se importaria de elaborar por que isso não vai funcionar para você?

Eu acho que você precisa pensar que tipo de relação existe entre PW e P.

É uma relação é-um? São exemplos de casos PW de P? Então não faria sentido ter PW Herdar do P.

É um tem-um relacionamento? Então você deve ficar com a contenção, e colocar-se com o inconveniente sintática.

Aliás, geralmente não é uma boa idéia para expor uma referência não-const para uma variável de membro na interface pública de uma classe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top