2014-08-30 10 views
0

저는 벡터에있는 모든 객체를 저장하고 변경하는 것을 다루는 Level 클래스가있는 게임을 만들고 있습니다.C++ 클래스가 const 클래스의 다른 클래스의 private 멤버에 액세스하는 방법 (읽기 전용이 아닌 경우에만 쓰기) ​​

그리고 Vector.h에 기반한 것들을 계산하는 정적 함수를 가진 Engine.h라는 또 다른 클래스가 있지만 그 안에는 아무 것도 변경하지 않습니다. Level은 Engine 함수를 호출하고 반환 된 내용을 기반으로 연산을 수행합니다.

하지만 Engine에서 Level이 소유하고있는 벡터를 확인해야하므로 벡터의 현재 상태를 기반으로 계산할 수 있도록 벡터의 포인터 (const)를 각 Engine 함수에 전달해야합니다. .

엔진이 모든 Level의 멤버 변수에 액세스 할 수있게 해주는 방법은 없지만 그 중 하나를 편집 할 수는 없습니다. 어떤 종류의 'const friend'?

방금 ​​객체 수준이 있다는 것을 깨달았습니다. 그래서 엔진에 'const 친구'가 될 수있는 수준의 특정 객체를 할당해야합니다. ' 아마도 이것은 복잡해질 수 있습니다. 해결책이 없다면 Engine 함수에 많은 멤버 변수를 전달하는 나쁜 습관이거나 이것이 어떻게 수행되는지입니다. Level에 대한 포인터를 const로 전달하면 어떻게됩니까? 그 또한 레벨 멤버 변수의 CONST의 모든을?)

+1

는'friend'는'const'를 오버라이드 (override)하지 않는, 그래서 친구가 클래스에'const를 레벨 *를'통과/기능을 제공합니다 읽기 전용. –

+0

'나는 각 엔진 함수에 벡터의 포인터 (const) 묶음을 강제로 전달합니다 .' 그리고 왜 const 멤버 함수를 통해 해당 벡터를 노출시킬 수 없습니까? –

답변

1

당신이 액세스 할 x 멤버 변수를 가지고 몇 가지 클래스 Foo이 있다고 할 수 있습니다. 당신은 const 기능을 할 수 있습니다 그쪽으로 값으로 멤버 변수에 액세스합니다. 그들은 const이기 때문에 멤버 변수를 수정할 수 없습니다.

class Foo 
{ 
public: 
    Foo() : x{0} {} // constructor 

    int getX() const  { return x; } // this is a "getter" 
    void setX(int value) { x = value; } // this is a "setter" 
private: 
    int x; 
}; 

다른 클래스 Bar을 가질 수 있습니다. 어쩌면 x 변수 인 Foo에 액세스해야하는 일부 기능에서는 getter를 사용할 수 있습니다.

class Bar 
{ 
    void doStuff (Foo a) 
    { 
     int answer = a.getX(); 
     std::cout << answer << std::endl; 
    } 
}; 

이제 간단한 데모를 볼 수 있습니다. Foo의 인스턴스와 Bar의 인스턴스를 만듭니다. 그런 다음 Foo에 대해 x 값을 설정하고 BardoStuff 함수에서 액세스 할 수 있습니다.

int main() 
{ 
    Bar myBar; 
    Foo myFoo; 

    myFoo.setX(5); 

    myBar.doStuff(myFoo); // will output 5 

    return 0; 
} 
+1

이것은 다른 클래스보다 한 클래스에 대한 읽기 액세스 권한을 더 부여하지 않습니다. –

+0

내 Game 클래스는 Level을 생성 한 다음이 Engine 함수를 호출하는 클래스입니다. 레벨 객체 포인터를 각 엔진 함수에 전달하면 제안한 getter 메소드를 사용할 수 있습니다. 그러나 클래스 포인터를 엔진에 전달하는 것이 깨끗합니까? 더 나은 구조가 있어야합니까? – Souren

0

도움이된다면 당신은 이런 식으로 물건을 수행 할 수 있습니다

class Level 
{ 
private: 
    std::vector<float> stuff; 

public: 

    // give outsiders const access 

    const std::vector<float>& const_stuff = stuff; // c++11 else use ctor 

    const std::vector<float>& get_stuff() const { return stuff; } // more idiomatic 
};