друг класса с ++ - PullRequest
       14

друг класса с ++

3 голосов
/ 29 октября 2008

Я пытаюсь скомпилировать такой код:

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

но get 'CCube :: Position' не доступен в функции main () 3 раза. Я хочу, чтобы класс CPosition был объявлен вне CCube, чтобы я мог использовать его в будущем в новых классах, например. CBall :) но как я могу заставить его работать без наследования. Возможно ли это:)?

С уважением, PK

Ответы [ 7 ]

5 голосов
/ 29 октября 2008

В дополнение к обычному геттеру у вас также должен быть постоянный геттер.
Пожалуйста, обратите внимание на возврат по ссылке. Это позволяет любому вызову SetXX () влиять на копию позиции внутри CCube, а не на копию, которую вы обновляли.

class CCube
{
    private:
        CPosition Position;
    public:
        CPosition&       getPosition()       { return Position; }
        CPosition const& getPosition() const { return Position; }
};
4 голосов
/ 29 октября 2008

Оператор friend class CPosition; означает, что CPosition теперь может получить доступ к закрытым членам класса CCube. Для всех остальных учеников все еще такие же личные, как вы их объявили. Чтобы образец работал, вы:

class CCube
{
     public:
         CPosition Position;
};
1 голос
/ 29 октября 2008

Ваше объявление о дружбе должно быть

friend int main();

Вы предоставляете «основному» разрешение на доступ к приватному члену CCube.

1 голос
/ 29 октября 2008

errr, no, позиция не видна в функции "main"

Сделайте его общедоступным ... или поместите публичную функцию получения в

0 голосов
/ 29 октября 2008

У вас есть 3 вопроса в одном:

  1. повторное использование CPosition
  2. как повлиять на состояние фигуры (в данном случае включает элемент типа CPosition, но может также включать int radius или что-то еще)
  3. Использование ключевого слова friend

Вы четко говорите, что вам нужен класс CPosition, чтобы он был доступен из других мест. Ну, это класс. Проблема 1 решена.

Если вы хотите, чтобы пользователи CCube могли изменить позицию CCube, вам необходимо предоставить средства для этого:

  1. Сделав CCube::Position публичным
  2. Путем добавления методов доступа - CCube::MoveTo( const CPosition& p ) и CCube::GetPosition() const.

Как сказал @Firas: не играйте с friend, пока не убедитесь, что он вам нужен.

0 голосов
/ 29 октября 2008

ОК, он работает с:

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

main()
{
  CCube cube1;

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

Спасибо

0 голосов
/ 29 октября 2008

Ну, вы уже получили ответ на ошибку. Одна вещь, хотя: Планируете ли вы предоставить кубу доступ к закрытым членам CPosition (itsX, itsY)? Если нет, его не нужно объявлять другом. Если это так, рассмотрите возможность использования открытых методов в CPosition для возврата X и Y, и вам все равно не нужно объявлять его как друга.

Что я говорю, так это то, что вам нужно убедиться, что вам нужно использовать друзей. Вот хорошее место для начала .

...