Dove mettere un metodo che usa solo l'interfaccia pubblica della sua classe?

-2

Per una classe come questa:

class Foo {
  public:
    virtual int GetA();
    virtual int GetB();
};

Dove dovrei dichiarare una funzione non virtuale GetSumOfAB ()?

1 - Rendilo un metodo di istanza?

class Foo {
  public:
    virtual int GetA();
    virtual int GetB();

    int GetSumOfAB() {
        return GetA() + GetB();
    }
};

2 - Rendilo un metodo statico, quindi era ovvio che fosse correlato alla classe Foo?

class Foo {
  public:
    virtual int GetA();
    virtual int GetB();

    static int GetSumOfAB( Foo& foo ) {
        return foo.GetA() + foo.GetB();
    }
};

3 - O renderlo una funzione gratuita?

namespace Bar {
    int GetSumOfAB( Foo& foo );
}

Che ne pensi?

EDIT:

Ho ricevuto molti downvotes strani, quindi vorrei chiarire qual è il problema.

GetSumOfAB () è un algoritmo che utilizza l'API pubblica della classe. Potrebbero esserci molti algoritmi. Dovrei metterli tutti nella classe come metodi di istanza? O dovrei preferire di non ampliare la mia classe?

    
posta Anton Petrov 19.05.2017 - 21:29
fonte

2 risposte

2

Sicuramente andrei con la prima opzione.

La seconda opzione è priva di senso, l'intero punto di un metodo di classe è che non dipende da alcuna particolare istanza della classe. Un metodo che opera su una particolare istanza è esattamente ciò che è un metodo di istanza. Basta usare quello.

    
risposta data 20.05.2017 - 00:37
fonte
2

Rendi una funzione non membro.

Se una funzione può essere implementata come funzione non membro, dovrebbe essere implementata come funzione non membro.

Vedi questo articolo piuttosto lungo ed elaborato di Scott Meyers che spiega How Non- Le funzioni dei membri migliorano l'incapsulamento .

    
risposta data 20.05.2017 - 00:41
fonte

Leggi altre domande sui tag