我是C ++的新手。请查看以下代码
Position.h
#pragma once
class Position
{
public:
Position(int x, int y, int z);
Position();
~Position();
void display();
private:
int x;
int y;
int z;
};
Position.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)
{
}
GameComponent.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;
};
GameComponent.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
的朋友类GameComponent
的方法update(const tm* time)
。实际上我想要做的是访问类Position
的私有数据成员。我怎样才能做到这一点?请帮忙
答案 0 :(得分:6)
C ++友谊的另一种方式是:如果GameComponent
将Position
声明为朋友,则意味着Position
可以访问GameCompenent
的所有私有方法。您需要的恰恰相反:从Position
GameComponent
私有方法
因此,如果Position::displayPositions()
是要从GameComponent访问的Position类的私有方法,那么您可以将GameComponent
声明为Position
的朋友:
class Position
{
friend class GameComponent;
...
};
答案 1 :(得分:1)
您应该GameComponent
成为Position
的朋友,您目前的方式允许Position
访问GameComponent
的私人和受保护成员,{{3}简单的解释。
答案 2 :(得分:1)
当您声明好友类时,您允许此类访问您的非公开数据。在您的示例中,GameComponent
允许Position
类访问GameComponent
非公开方法和属性。
我认为你的pourpose是Position
来自GameComponent
,所以你的声明必须在Position
课堂内,GameComponent
是一个友好的课程(注意:你不要&#39}真的需要这个,因为Position::display()
是公开的:
class Position
{
.....
friend class GameComponent;
};
使用此声明,您可以从Position
访问GameComponent
个组件。但是,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
的{{1}}属性,则必须将其作为参数传递:
GameComponent
此外,在Position.cpp
中实现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();
}
函数是一个很好的实践