Frage

Ich versuche, einen solchen Code zu kompilieren:

#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();
}

aber get 'Ccube :: Position' nicht zugänglich ist in der Funktion main () 3 mal. Ich will Klasse CPosition erklärt außerhalb Ccube werden, so dass ich es in Zukunft in neuen Klassen können zum Beispiel CBall :) aber wie kann ich es machen, ohne Vererbung arbeiten. Ist es möglich?)

Viele Grüße, PK

War es hilfreich?

Lösung

Neben dem normalen Getter sollten Sie auch einen konst Getter haben.
Bitte beachten Sie die Rückkehr Bezug genommen wird. Auf diese Weise können Sie einen Anruf an SetXX (), um die Kopie der Position innerhalb Ccube beeinflussen und nicht die Kopie, die Sie aktualisieren haben.

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

Andere Tipps

Die Aussage friend class CPosition; bedeutet, dass CPosition jetzt die privaten Mitglieder der Ccube Klasse zugreifen können. Zu jeder anderen Klasse sind die Mitglieder noch so privat wie Sie sie erklärt. Um die Probe Arbeit, die Sie würde:

class CCube
{
     public:
         CPosition Position;
};

Fehler, nein, Position ist nicht sichtbar in der Funktion "main"

Machen Sie es öffentlich ... oder eine öffentliche Getter Funktion setzt in

Ihr Freund Erklärung müßte sein

friend int main();

Sie sind ‚Haupt‘ Erlaubnis gebend Ccube Privat Mitglied zugreifen zu können.

Nun, Sie haben bereits eine Antwort für den Fehler. Ein Ding aber: Haben Sie auf mit dem Würfel Zugriff auf die privaten Mitglieder CPosition (itsX, itsY) planen? Wenn nicht, muss sie nicht als Freund deklariert werden. Wenn es ist, sollten öffentliche Methoden in CPosition aussetzt zurückzukehren X und Y, und Sie noch brauchen Sie es nicht als Freund zu erklären.

Was ich sagen will ist, dass Sie sicherstellen müssen, dass Sie verwenden Freunde brauchen. Hier ist ein guter Anfang .

OK es funktioniert mit:

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

main()
{
  CCube cube1;

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

Danke

Sie haben 3 Fragen in einem:

  1. Wiederverwertbarkeit von CPosition
  2. , wie ein Zustand der Form beeinflussen (in diesem Fall ein Mitglied des Typs CPosition umfasst, kann aber auch eine int radius oder etwas anderes)
  3. Verwendung des friend Schlüsselwort

Sie klar sagen, dass Sie die CPosition Klasse müssen von anderen Orten zugänglich sein. Nun, es ist Klasse. Problem 1 gelöst.

Wenn Sie möchten, dass Sie Benutzer CCube Lage sein, einen CCube Position zu ändern, müssen Sie dafür ein Mittel bereitzustellen:

  1. Durch die CCube::Position öffentlich
  2. Durch das Hinzufügen Accessormethoden -. CCube::MoveTo( const CPosition& p ) und CCube::GetPosition() const

Wie @Firas sagte:. Nicht mit friend spielen, bis Sie wirklich sicher, dass Sie es brauchen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top