3

我是 C++ 新手。请看下面的代码

位置.h

#pragma once
class Position
{
public:
    Position(int x, int y, int z);
    Position();
    ~Position();

    void display();

private:
    int x;
    int y;
    int z;
};

位置.cpp

#include "Position.h"
#include <iostream>

using namespace std;

Position::Position(int x, int y, int z)
{
    this->x = x;
    this->y = y;
    this->z = z;
}

Position::Position(){}


Position::~Position(void)
{
}

游戏组件.h

#pragma once
#include<time.h>

class GameComponent
{
public:
    GameComponent(int);
    GameComponent();
    ~GameComponent(void);

    virtual void update(const tm*);
    friend class Position;

private:
    int id;
};

游戏组件.cpp

#include "GameComponent.h"
#include <iostream>
#include <time.h>
#include "DrawableGameComponent.h"

using namespace std;

GameComponent::GameComponent(int v):id(v)
{

}

GameComponent::GameComponent(){}


GameComponent::~GameComponent(void)
{

}

void GameComponent::update(const tm* time)
{
    cout << "ID : " << id << endl;
    cout << "Update: " << time->tm_hour << ":" << time->tm_min << ":" << time->tm_sec << endl;

    //Position::displayPositions();
}

void Position::display()
{
    cout << "X" << x << "Y" << y << "Z" << z << endl;
}

我需要访问GameComponent方法display()中属于类的朋友类Position的方法。实际上我想做的是访问 class 的私有数据成员。我怎样才能做到这一点?请帮忙GameComponentupdate(const tm* time)Position

4

3 回答 3

6

C++ 友谊以另一种方式工作:如果GameComponent声明Position为朋友,则意味着可以Position访问GameCompenent. 你需要的恰恰相反:调用Position私有方法GameComponent

因此,如果Position::displayPositions()您想从 GameComponent 访问 Position 类的私有方法,那么您可以声明GameComponent为以下的朋友Position

class Position
{
    friend class GameComponent;
    ...
};
于 2012-12-19T07:43:39.193 回答
1

您应该交GameComponent朋友Position,您目前拥有的方式允许Position访问GameComponent的私人和受保护成员,请参阅 wikipedia的简单说明。

于 2012-12-19T07:44:05.057 回答
1

当你声明一个朋友类时,你允许这个类访问你的非公共数据。在您的示例中,GameComponent允许Position类访问GameComponent非公共方法和属性。

我认为您的 pourpose 是从 访问PositionGameComponent,因此您的声明必须在Position类内创建GameComponent一个友好的类(注意:您实际上并不需要它,因为Position::display()它是 public :

class Position
{
   .....
   friend class GameComponent;

};

通过此声明,您可以PositionGameComponent. 但是,Position::display()函数不是静态函数,您需要实例化一个 Position 对象:如下所示:

class GameComponent
{
    protected:
        Position pos;
};

void GameComponent::update(const tm* time)
{
    cout << "ID : " << id << endl;
    cout << "Update: " << time->tm_hour << ":" << time->tm_min << ":" << time->tm_sec << endl;

    pos.displayPositions();
}

如果您没有Position属于GameComponent您的属性,则必须作为参数传递:

void GameComponent::update(const tm* time, Position & pos)
{
    cout << "ID : " << id << endl;
    cout << "Update: " << time->tm_hour << ":" << time->tm_min << ":" << time->tm_sec << endl;

    pos::displayPositions();
}

Position::display此外,在 Position.cpp 中是一个很好的实践实现函数

于 2012-12-19T07:48:55.060 回答