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)
{
}

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 のメソッド内の class のdisplay()friend クラスに属するメソッドにアクセスする必要があります。実際に私がやろうとしているのは、 class のプライベート データ メンバーにアクセスすることです。これどうやってするの?助けてくださいPositionGameComponentupdate(const tm* time)Position

4

3 に答える 3

6

C++ のフレンドシップは逆に機能します。 がフレンドとしてGameComponent宣言されている場合は、 のすべてのプライベート メソッドにアクセスできるPositionことを意味します。必要なのは正反対です:からプライベート メソッドを呼び出します。PositionGameCompenentPositionGameComponent

Position::displayPositions()が GameComponent からアクセスしたい Position クラスのプライベート メソッドである場合、次のGameComponentようにフレンドとして宣言できPositionます。

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

GameComponentのフレンドを作成する必要がPositionあります。現在の方法で、のプライベートおよび保護されたメンバーPositionにアクセスできます。ウィキペディアの簡単な説明を参照してください。GameComponent

于 2012-12-19T07:44:05.057 に答える
1

フレンド クラスを宣言すると、このクラスが非パブリック データにアクセスできるようになります。あなたの例でGameComponentは、クラスが非公開のメソッドと属性Positionにアクセスできるようにします。GameComponent

Positionあなたの目的はからのアクセスだと思うGameComponentので、宣言はフレンドリーなPositionクラスを作成するクラス内にある必要があります(注: public でGameComponentあるため、これは実際には必要ありません: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属している属性がない場合は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 に答える