Costruttore predefinito e ritorno per puntatore

3

Ho una classe Item che ha un costruttore non predefinito e non ha un costruttore predefinito. Non esiste un costruttore predefinito perché non voglio avere oggetti Item con alcuni valori predefiniti strani intorno.

class Item {

    int a;

public:

    Item(int a) : a(a) {}

}

Un'altra classe User utilizza la classe Item e ha un metodo GetItem(Item * item) che restituisce un oggetto Item per puntatore.

class User {

    Item item;

public: 

  bool SetItem(Item item) {
       this->item = item;
       return true;
  }

  bool GetItem(Item * item) { // Can't do "Item * GetItem()"
      *item = this->item;
      return true;
  }
}

Il problema è quando provo a GetItem() da qualche parte nel mio programma, ho ancora bisogno di allocare memoria per un oggetto Item usando alcuni valori casuali, ad esempio Item anotherItem(999);

User user;
Item item(5);
user.SetItem(item);

// Here is the problem
Item anotherItem(999); // any random value
user.GetItem(&anotherItem);

Qual è la migliore pratica per gestire tali situazioni? È meglio avere un costruttore predefinito?

Grazie per il tuo aiuto in anticipo.

    
posta Konstantin 16.02.2017 - 08:42
fonte

2 risposte

3

In una situazione come la tua, ci sono solo poche opzioni reali

  1. Consenti la creazione di un Item predefinito costruito. Questo significa aggiungere un costruttore predefinito
  2. Restituisce un (puntatore a un) Item da GetItem
  3. Prendi un Item** o Item*& e lascia che il% pointerItem passato si riferisca al% interno% di% di% di% di co_de.

Nessuna delle opzioni è intrinsecamente migliore di una qualsiasi delle altre, sebbene la terza abbia il grande svantaggio di consentire la modifica del contenuto Item senza passare attraverso un metodo della classe User . Ciò apre la porta alla violazione dei costrutti che User cerca di mantenere.

    
risposta data 16.02.2017 - 09:07
fonte
0

È possibile utilizzare un puntatore per l'oggetto OtherValue. Non è necessario chiamare il costruttore, è possibile passarlo alla funzione getItem, non è necessario gestirlo, perché chiaramente non si ha la proprietà di esso.

    
risposta data 16.02.2017 - 08:53
fonte

Leggi altre domande sui tag