Domanda

Sto cercando di compilare questo codice:

#include <iostream>
using namespace std;

class CPosition
{
  private:
    int itsX,itsY;
  public:
    void Show();
    void Set(int,int);
};

void CPosition::Set(int a, int b)
{
  itsX=a;
  itsY=b;
}

void CPosition::Show()
{
    cout << "x:" << itsX << " y:" << itsY << endl;
}

class CCube
{
  friend class CPosition;
  private:
         CPosition Position;
};

main()
{
  CCube cube1;

  cube1.Position.Show();
  cube1.Position.Set(2,3);
  cube1.Position.Show();
}

ma ottieni 'CCube :: Position' non è accessibile nella funzione main () 3 volte. Voglio che la classe CPosition venga dichiarata all'esterno di CCube in modo da poterla utilizzare in futuro in nuove classi, ad es. CBall :) ma come posso farlo funzionare senza usare l'ereditarietà. È possibile :)?

Saluti, PK

È stato utile?

Soluzione

Oltre al normale getter dovresti avere anche un const getter.
Si prega di notare il ritorno per riferimento. Ciò consente a qualsiasi chiamata a SetXX () di influire sulla copia di Position all'interno di CCube e non sulla copia che si sta aggiornando.

class CCube
{
    private:
        CPosition Position;
    public:
        CPosition&       getPosition()       { return Position; }
        CPosition const& getPosition() const { return Position; }
};

Altri suggerimenti

L'istruzione classe di amicizia CPosition; significa che CPosition ora può accedere ai membri privati ??della classe CCube. Per ogni altra classe i membri sono ancora privati ??come li hai dichiarati. Per far funzionare il campione, dovresti:

class CCube
{
     public:
         CPosition Position;
};

errore, no, Posizione non è visibile nella funzione " main "

Rendi pubblico ... o inserisci una funzione getter pubblica in

La dichiarazione del tuo amico dovrebbe essere

friend int main();

Stai concedendo l'autorizzazione "principale" per accedere al membro privato di CCube.

Bene, hai già una risposta per l'errore. Una cosa però: Intendi che il cubo acceda ai membri privati ??di CPosition (itsX, itsY)? In caso contrario, non deve essere dichiarato come amico. In tal caso, considera di esporre metodi pubblici in CPosition per restituire X e Y e non devi ancora dichiararlo come amico.

Quello che sto dicendo è che devi assicurarti di usare amici. Ecco un un buon punto di partenza .

OK funziona con:

class CCube
{
  private:
         CPosition Position;
  public:
  CPosition& getPosition() { return Position; }
};

main()
{
  CCube cube1;

  cube1.getPosition().Show();
  cube1.getPosition().Set(2,3);
  cube1.getPosition().Show();
}

Grazie

Hai 3 domande in una:

  1. riusabilità di CPosition
  2. come influenzare lo stato di una forma (in questo caso include un membro di tipo CPosition , ma può anche includere un int radius o qualcos'altro)
  3. Utilizzo della parola chiave friend

Dici chiaramente che hai bisogno che la classe CPosition sia accessibile da altri luoghi. Bene, è classe. Il problema 1 è stato risolto.

Se vuoi che i tuoi utenti CCube possano cambiare la posizione di un CCube , devi fornire un mezzo per farlo:

  1. Rendendo CCube :: Position pubblico
  2. Aggiungendo metodi di accesso - CCube :: MoveTo (const CPosition & amp; p) e CCube :: GetPosition () const .

Come diceva @Firas: non giocare con amico finché non sei davvero sicuro di averne bisogno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top