Jump to content

Instância de classe gestora com "acesso directo" aos métodos das instâncias da classe gerida


Go to solution Solved by HappyHippyHippo,

Recommended Posts

Posted (edited)

Olá pessoal.

Estou a desenvolver uma biblioteca em C++ e, neste momento, dar-me-ia imenso jeito ter uma forma de aceder aos métodos de uma instância de outra classe.

Numa classe (vamos chamá-la de FooMgr) tenho um map que me permite aceder a instâncias de outra classe (vamos assumir que se chama foo) através do seu nome.

map<string, Foo> foolist;

FooMgr é, portanto, um gestor de instâncias de Foo onde posso dar um nome arbitrário a cada uma dessas instâncias. De momento preciso de fazer algo deste género para aceder aos métodos de cada instância:

FooMgr foo();
// etc...
foo.getInstance("batatas").coisas();
foo.getInstance("batatas").cenas();
foo.getInstance("batatas").factos();

A minha ideia é definir a instância actual e, a partir daí, aceder directamente aos seus métodos sem precisar de recorrer a este "proxy" (getInstance)

FooMgr foo();
// etc...
foo.setCurrent("batatas");
foo.coisas();
foo.cenas();
foo.factos();

Sei que existe forma de fazer isto em Delphi, mas desconheço se há algum mecanismo para tal em C++. As minhas pesquisas deram num beco sem saída (talvez não esteja a usar as keywords certas nas pesquisas, idk).

Conhecem alguma forma de fazer isto em C++, ou de o simular de uma forma um tanto-quanto elegante?

Cumprimentos.

Edited by thoga31
Edição de código para esclarecimento
  • Vote 1

Knowledge is free!

  • 5 months later...
Posted

Caramba, só agora me lembrei de vir responder 😕

@HappyHippyHippo, editei o post inicial uma vez que me enganei e declarei foo como sendo instância de Foo e não de FooMgr.

Eu sei que posso fazer o que pretendo desta forma:

class FooMgr {
  Foo *current;
  map<string, Foo> instances;
  
  void setCurrent(string name) {
    current = instances.getInstance(name);
  }
  
  void bar() {
    current->bar();
  }
  
  // etc...
}

Mas isto acaba por criar uma quantidade de código repetitiva e não sei se é a forma mais elegante de o fazer.

 

Knowledge is free!

  • Solution
Posted

continuo a achar que o uso de setCurrent e getCurrent seria melhor, e a chamada dos métodos nunca passar pelo manager a melhor solução

isto porque existem situações que caso contrário iria te complicar esse métodos no manager que não estás a contemplar:

- o que acontece no estado inicial onde não está definido o current ?

- e so o instances.getInstances não te retornar uma instancia correcta ?

eu não vejo problema no uso de um manager de instâncias, mas o que pretendes parece over-engenieering

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Posted
21 horas atrás, HappyHippyHippo disse:

continuo a achar que o uso de setCurrent e getCurrent seria melhor

Yep, é o que muito provavelmente irei fazer quando continuar a implementar a biblioteca.

Eu faria o código de forma a contemplar os casos que referiste (e outros específicos à biblioteca), mas talvez fosse de facto over-engineering. No Delphi podemos definir uma propriedade como default e isso permite automaticamente o comportamento que procurava, mas isto é C++, não Delphi, portanto adapto-me e siga caminho 😄

Obrigado pelo teu input.

Knowledge is free!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.