如何访问友元类方法?

How to access the friend class method?

本文关键字:友元 类方法 访问 何访问      更新时间:2023-10-16

我是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;
}

我需要访问方法display()该方法,该方法属于游戏组件update(const tm* time)方法中类GameComponent的友元类Position。实际上我正在尝试做的是访问类Position的私有数据成员。我该怎么做?请帮忙

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

因此,如果Position::displayPositions()是您要从游戏组件访问的 Position 类的私有方法,则可以将GameComponent声明为Position的朋友:

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

你应该让GameComponent成为Position的朋友,你目前拥有它的方式允许Position访问GameComponent的私人和受保护的成员,请参阅维基百科的简单解释。

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

我认为您的 pourpose 是从GameComponent访问Position,因此您的声明必须在类Position内,使GameComponent成为一个友好的类(注意:您并不真正需要这个,因为Position::display()是公开的:

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

通过此声明,您可以从GameComponent访问Position组件。但是,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();
}

如果没有属于GameComponentPosition属性,则必须作为参数传递:

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功能是否是一种好的做法.cpp