如何访问friend类方法?

时间:2012-12-19 07:36:39

标签: c++ visual-studio-2010 friend

我是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的私有数据成员。我怎样才能做到这一点?请帮忙

3 个答案:

答案 0 :(得分:6)

C ++友谊的另一种方式是:如果GameComponentPosition声明为朋友,则意味着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(); } 函数是一个很好的实践