Pergunta

Eu estou querendo saber se é possível adicionar métodos em programa principal para uma classe existente definido no arquivo de cabeçalho. Por exemplo: Há class CFun definido no CFun.hpp arquivo, mas em nossa party.cpp queremos adicionar um método void hello() {cout << "hello" << endl;};without edição CFun.hpp

Obviamente (infelizmente) construção:

#include "CFun.hpp"

class CFun
{
  public:
    void hello() {cout << "hello" << endl;};
};

não funciona retornando um erro Multiple declaration for 'CFun'

É possível fazê-lo funcionar sem herança de classe?

Foi útil?

Solução

Não, mas você pode adicionar um método que leva uma referência / ponteiro para uma classe CFun - você simplesmente não terá acesso a dados privados:

void Hello(CFun &fun)
{
    cout << "hello" << endl;
}

Este é provavelmente o melhor que você vai ser capaz de fazer. Como fora apontado por litb - esta função tem que estar no mesmo namespace como CFun. Felizmente, namespaces, ao contrário de aulas, pode ser adicionado a em vários lugares.

Outras dicas

Você pode redefinir a classe como este:

#define CFun CLessFun
#include "CFun.hpp"
#undef CFun

class CFun : CLessFun
{
   public:
    void hello() {cout << "hello" << endl;};
};

Coloque isso em uma nova CMoreFun.hpp arquivo de cabeçalho e incluir que em vez de CFun.hpp

Não, isso não é possível. Só pode haver uma definição de qualquer classe particular, e ele tem que ser uma definição completa, o que significa que você não pode ter definições parciais em lugares diferentes, acrescentando que os membros da classe.

Se você precisa adicionar uma função de membro para uma classe, então ou você tem que mudar a definição de classe (edit CFun.hpp), ou derivar uma nova classe de CFun e hello() colocar lá.

O análogo mais próximo a esse tipo de construto (adicionando funcionalidade para classes predefinidas) em C ++ é o padrão decorador. Não é exatamente o que você procura, mas pode permitir que você faça o que você precisa.

Este parece ser um caso de uso óbvio para a herança. Definir uma nova classe:

#include "CFun.hpp"

class CFun2 : public CFun
{
  public:
    void hello() {cout << "hello" << endl;};
};

Em seguida, use CFun2 vez de CFun em seu código-fonte.

Depois de pensar sobre isso, você poderia fazer algo terrível: Encontre alguma função no CFun que tem um tipo de retorno que você quer, e só é mencionado uma vez em todo o cabeçalho. Vamos void GoodBye() digamos.

Agora crie um arquivo CFunWrapper.hpp com este conteúdo:

#define GoodBye() Hello() { cout << "hello" << endl; } void GoodBye()
#include "CFun.hpp"
#undef GoodBye

Então só já incluem CFunWrapper.hpp vez de CFun.hpp.

Mas não faça isso, a menos que haja alguma boa razão para fazê-lo. É extremamente propenso a quebrar, e pode mesmo não ser possível, dependendo do conteúdo de CFun.hpp.

Não que eu saiba. Embora, você poderia fazer algum tipo de gambiarra e fazer uma solução namespace-y.

class Party : class CFun

(seu party.cpp)

herda coisas CFun, incluindo Olá () função.

Então ...

Party p;
p.hello();

Não?

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