Aggiunta di una funzione al membro della classe

2

Non sono sicuro della terminologia corretta qui, quindi ho difficoltà a trovare la risposta alla mia domanda, ma ecco cosa voglio ottenere.

di avere

class ABC {
public:
    int number;
};

e voglio aggiungere una funzione all'interno dell'ambito del numero int (penso sia come lo diresti tu). qualcosa come IsNeg () ma mi piacerebbe usarlo in questo modo:

ABC abc;
abc.number.IsNeg();

che restituirebbe vero o falso. Sarebbe possibile qualcosa di simile?

    
posta drjinx 07.04.2016 - 17:15
fonte

3 risposte

3

Il comportamento dovrebbe essere all'interno della classe, quindi non hai bisogno di queste chiamate nidificate . .

Il seguente design offre esattamente ciò che desideri senza aggiungere una complessità speciale di una classe personalizzata che rappresenta un valore.

class ABC
{
public:
    int number;

    bool isNumberNegative() const
    {
        return number < 0;
    }
};

// ... //

ABC abc;
auto isNegative = abc.isNumberNegative();

Questa soluzione suggerita è anche in linea con la Legge di Demeter .

    
risposta data 07.04.2016 - 17:22
fonte
1

La risposta breve è no (dai un'occhiata a Metodi di estensione in c ++ e C +++ Funzioni di estensione? per ulteriori dettagli).

Per gli operatori che non sono già stati definiti da una classe, puoi scrivere sovraccarichi che funzionano su quella classe ed è un piccolo come estensioni di metodo.

Tuttavia, il "tutto è un paradigma dell'oggetto" non regge in C ++ e funzioni libere ( Cosa c'è in una classe? ) / La ricerca di Koenig / namespace è il modo C ++.

Nel tuo esempio, potresti:

  • aggiungi una funzione membro come nella risposta di David Packer ( number dovrebbe essere privato)
  • crea number una classe o struct ( Erik Eidt's commento )
  • crea class ABC a struct e lavora direttamente sul membro dati number
  • scrivi una funzione gratuita

    bool is_neg(const ABC &abc)
    {
      return abc.number < 0;
    }
    
risposta data 07.04.2016 - 19:32
fonte
0

In pratica, questo non può essere fatto con il tuo pezzo di codice. Perché, C ++ non fornisce tipi primitivi come classe. Quindi, abc.number.IsNeg() non è possibile.

Puoi ottenerlo utilizzando il codice riportato di seguito. Ma non lo consiglierò, ma segui il consiglio di @ David per evitare la complessità.

class ABC {
public:
    Number number;
}
class Number {
public:
    int data;
    bool IsNeg() {
        return data < 0;
    }
}

Ora puoi scrivere questo:

ABC abc;
abc.number.IsNeg();
    
risposta data 11.04.2016 - 20:59
fonte

Leggi altre domande sui tag