2011-05-01 7 views
1

저는 제 친구와 함께 C++로 돌아가고 있습니다. 저는 기본 텍스트 기반 던전 게임을 작성하고 플레이어가 위, 아래, 왼쪽, 오른쪽으로 움직 이도록하려고합니다. 음, 내 질문에는 두 부분이 있습니다.여기에서 친구 클래스를 사용해야합니까?

Map 클래스, Player 클래스 및 GameLoop 클래스를 만들었습니다. 일어나는 모든 일은 분명히 내 GameLoop 안에 있습니다. Map 클래스에는 Move()라는 함수가있어 플레이어를 이동합니다. Map 클래스에서 Player 클래스가 Map 클래스에 대한 우정 액세스를 허용해야합니까? 나는 친구 수업을 언제 사용하는지 혼란 스럽다. 나는 게임 루프 함수가 map.Move()를 사용해야하는지, 아니면 Move()를 Player 클래스에 넣고 친구로 만들고 player.Move()를 사용해야하는지 궁금합니다.

지도 등급에는 내 플레이어가있는 좌표의 개인 데이터가 저장됩니다.

나는 이것이 약간 주관적일지도 모르지만 나는 일반적으로 다소 이야기하고있다. friend 클래스를 사용하여 Map 객체를 직접 사용하는 것이 더 효율적입니까?

내 두 번째 질문입니다. 나는 클래스가 매우 일반적이라는 것을 알고 있지만 객체가 있는지 궁금해하고 있습니다. 모든 클래스에 대해 적어도 하나의 객체를 만들어야합니까? 아니면 객체를 만들지 않고도 클래스를 만들고 사용할 수 있습니까?

+0

왜'Move()'를'Player'가 아닌'Map'의 멤버 함수로 만들었습니까? – Maxpm

+0

@ Maxx :이 작업을 수행해야하는 이유는 여러 가지가 있습니다. 그 중 하나는 플레이어의 위치를 ​​캡슐화하는 '지도'입니다. 이 기능은 2D 그리드에서 충돌 감지를 수행 할 때 매우 유용합니다. –

답변

2

클래스는 메소드 및 상태/데이터을 가질 수 있기 때문에 유용합니다. 일반적으로 클래스에 데이터가있는 경우 개체를 만들지 않는다는 것은 의미가 없습니다. 그러나 공용 정적 함수로만 구성된 유틸리티 클래스를 구현할 수 있습니다. 이 경우 어떤 객체도 만들 필요가 없습니다. 귀하의 경우에는

Class CMyHelper 
{ 
public: 
    static double calculateDistance(CPoint A, CPoint B); 
    static double calculateArea(double length, double width); 
    //... 
private: 
    // You can even explictly say, I don't want make objects of this class. 
    // You'll get a compile-time error if someone tries. 
    CMyHelper(); 
    CMyHelper(const CMyHelper&); 
} 

CPoint A(100, 200); 
CPoint B(50, 100); 
//Call static method without instantiation 
CMyHelper::calculateDistance(A, B); 

은, 우리가 볼 수있는 정적 클래스 및 친구 클래스를 사용할 필요가 없다.

나에게는 친구 클래스가 가장 먼저해야 할 일이 있습니다. 설명에 따르면 은 player 클래스의 public 메서드가 될 수 있습니다. map 대신 실제로 "이동하는"플레이어이기 때문입니다. 또한 map 클래스가하는 것이 무엇인지 명확히해야합니다.

편집 :지도 클래스가 제거하기에 충분하면 플레이어의 좌표를 플레이어 클래스로 이동할 수 있습니다. 당신이 대답은 주관적이다 말했듯이 그것은 Player에 대한 작업을 수행으로

Class CPlayer 
{ 
public: 
    void move() 
    { 
     // moves up, down, left, or right 
     // update m_position 
    } 
} 

private: 
    CCoordinate m_position; 
} 
+0

클래스를 만들고 "객체 만들기"없이 클래스를 사용할 수 있습니다. 이것들을 조금 더 자세히 들여다보고 싶을 때를 대비하여 정적 클래스라고합니다. 내 말은, – Pete

+0

. 그래서이 예제에서는 map.Move()가 player.Move()보다 감각이 떨어지지 만, 보통 내가 만든 클래스의 객체를 사용해야합니다. 플레이어의 좌표가 Map의 개인 데이터이기 때문에 Move()를 사용하여지도에 액세스해야합니다. 답장을 보내 주셔서 감사합니다. – Christian

+0

예, 귀하가 선호하는 경우 정적 클래스가 필요하지 않으므로 객체를 사용하십시오. 지도 객체를 플레이어 상태의 일부로 만들면 플레이어의 move()에서 좌표에 액세스 할 수 있습니다. 다시 말하면, corderinates 이외의지도는 무엇입니까? 다른 것, 당신은 그것을 플레이어 클래스로 옮기고 맵을 제거 할 수 있습니다. –

0

, 나는, player 클래스 내부 Move()을 유지 선호 할 것입니다.

Map 클래스가 수행해야 할 작업을 잘 모르겠습니다. 그것에 대한 세부 사항은 언급하지 않았습니다.

클래스를 만들어서 객체를 만들지 않고도 사용할 수 있습니까?
예, 클래스를 가질 수 있으며 클래스의 객체를 만들지 않고도 호출 할 수있는 클래스 내에 정적 메서드가있을 수 있습니다. 나는 실제적인 예를 생각할 수 없다.

코드 예제 :

class MyClass 
{ 
    static int i; 

    public: 
    static void incrementCount() 
    { 
     i++; 
    } 

    static int returnCount() 
    { 
     return i; 
    } 
}; 

int MyClass::i = 0; 

int main() 
{ 

    int count; 
    //Do Some processing 

    MyClass::incrementCount(); 

    //Do Some More processing 

    count = MyClass::returnCount();   

    return 0; 

} 
+0

답장을 보내 주셔서 감사합니다. 개인 데이터에서 플레이어의 좌표를 보유하므로 Map을 사용합니다. – Christian

+0

@ vorbis5 : Map에 의해 공개 된 public 메소드를 호출하여 이동 세부 사항으로 Map을 업데이트 할 수 있습니다. –

2

friends 인은 두 개의 클래스가 가질 수있는 단단한 커플 링입니다. 일반적으로 높은 결합에서 함축 된 종속성을 피하기를 원합니다. 클래스에서 Map 클래스의 공용 인터페이스를 사용하십시오. 일 때 friend을 사용해야합니다. 공공// 보호가 개인 검사를 컴파일 시간에 적용되기 때문에, friend 정말 효율 관련되지 않습니다 효율성에 관한

void MainLoop() { 
    // ... Read input and so on ... 

    player.Move(input); 
    map.Update(player.GetPosition()); 
} 

가 :

나는 같은 것을 할 것입니다. 그리고 그렇게하더라도 효율성을 달성하기 위해 friend을 사용하면 조기 최적화의 별의 예가 될 수 있습니다.

클래스에 정적 멤버가 일부만 있거나 정적 멤버가있는 경우 개체를 인스턴스화하지 않고 사용할 수 있습니다. 클래스가 있지만 멤버가없는 일반적인 경우는 추상 인터페이스입니다. 이러한 클래스는 인터페이스를 정의하는 기본 클래스가되도록 설계되었으며, 나중에 클래스가 상속하고 구현합니다.

+0

추상 수업, 예, 좋은 지적. –

+0

매개 변수로 함수를 전달할 수 있는지 몰랐습니다. – Christian

+0

@ vorbis5 : 함수 포인터, 펑터를 전달할 수 있습니다 (C++ 0x, lambdas에서는). 그러나 위의 코드에서'input'은 일반적인 변수이고'player.GetPosition()'은 함수가 아니라 함수의 반환 값입니다. – Lstor

0

나는 당신의 질문에 대한 두 가지 일반적인 측면에 대해 반응 할 것이며, 당신이 언급하고있는 특별한 경우를 피하십시오. 당신은 많은 세부 사항을 제공하지 않았으며, 일반적인 경우가 당신이 우정을 사용할 필요가 있는지 여부를 결정하는 데 도움이되기를 바랍니다.

나는 친구 수업을 언제 사용하는지 혼동합니다.

friend 더 이상 추천 publicprotected하거나 부분 또는선택적 액세스를 허용하는 것을 private이다. 일반적으로 누군가에게 액세스 권한을 부여하는 대신 단일 클래스 또는 함수에 대한 액세스 권한을 부여하려는 경우 friend 선언을 사용해야합니다.

너는 단단하고 단단한 장소에있어. 액세스 권한을 가져야하므로 private을 사용할 수 없습니다. 다시 은 을 사용할 수 없으므로이 데이터를 캡슐화해야합니다. 이 경우 friendprotected을 사용하면 그 단단한 부분을 짤 수 있습니다.

friendprotected 사이의 기본적인 차이는 후자가 열려 당신이 액세스 권한을 부여 누구 기관의 수에를 종료 것입니다.

자세한 내용이나 예를 보려면 C++ FAQgreat section about friends이 있어야합니다.

나는 이것이 약간 주관적 일지 모르지만 나는 일반적으로 다소 이야기하고있다. friend 클래스를 사용하여 Map 객체를 직접 사용하는 것이 더 효율적입니까?

이것은 주관적인 것과 관계가 없습니다. 액세스 제한은 컴파일시에만 사용되며 프로그램 실행시에는 사용되지 않습니다. 따라서 런타임 오버 헤드가 발생하지 않습니다.참조 된 데이터 멤버가 간단한 인라인 getter 함수를 통해 액세스되는 경우 오버 헤드가 발생하지 않습니다. 어쨌든, 나는이 사건을 조사하기 시작하지 않을 것입니다. 다른 경우를 제외하면 이 아니기 때문에 병목 현상이 있습니다. 병목 현상이 있습니다.

관련 문제