2012-12-19 30 views
2

我是C++新手。請看看下面的代碼如何訪問friend類的方法?

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

我需要訪問的方法display()這是屬於GameComponent的update(const tm* time)方法中GameComponent類的友元類Position。其實我想要做的是訪問類Position的私人數據成員。我怎樣才能做到這一點?請幫助

+0

請看看這個:http://www.cplusplus.com/doc/tutorial/inheritance/ – Lucian

+0

友誼不是雙向的關係,你有其他的方式... –

+0

另外,顯示器目前是公開的,所以這裏不需要友誼。 – jpm

回答

5

C++友好工作的其他方式:如果GameComponent聲明Position作爲一個朋友就意味着Position可以訪問GameCompenent所有的私有方法。你需要的是完全相反的:調用從GameComponent

所以Position私有方法,如果Position::displayPositions()是要從GameComponent訪問,那麼你可以聲明GameComponentPosition朋友位置級別的私有方法:

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

你應該GameComponentPosition的朋友,你現在有它允許Position訪問GameComponent的private和protected成員,see wikipedia的簡單解釋的方式。

0

當您聲明朋友類時,您允許此類訪問您的非公開數據。在你的例子中,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(); 
} 

如果你有屬於GameComponent沒有Position屬性,您必須通過參數:

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函數在positio n.cpp