2014-01-30 5 views
0

알아, 알아. 질문은 단지 "당신은 그 상황에 있어서는 안된다!"고 비명을 지른다. 하지만 내 말 들려 ...const 멤버 변수를 수정할 수 있습니까?

나는 한 스레드에서 업데이트를 수행하고 다른 스레드에서 렌더링을 수행하는 게임 엔진을 가지고있다. 렌더링은 이전 프레임의 데이터를 읽으려는 반면, 업데이트는 다음 프레임의 데이터를 업데이트합니다.

그래서이 문제를 해결하려면 mutable_data 구조체 (속도, 위치 등 ...)를 변경할 수있는 객체의 모든 것이 있습니다. 객체 내부에 두 개의 인스턴스가 있고 const와 다른. 게임 루프의 한 반복이 끝나면 비 const 데이터는 최신 데이터 객체가 될 것이므로이 인스턴스를 이제는 동일하게 복사하여 다음 반복을 위해 준비해야합니다.

이것이 가능합니까? 당신이 명 데이터 구조, 현재 (CONST) 하나 하나는 곧 하나 서로에 대한

#include <iostream> 

struct mutable_data 
{ 
    int i = 1; 
    bool j = true; 
    char k = 'a'; 
}; 

struct my_data 
{ 
    my_data() : constData() {} 

    int i() const { return constData.i; } 
    bool j() const { return constData.j; } 
    char k() const { return constData.k; } 

    void set_i(int i) { data.i = i; } 
    void set_j(bool j) { data.j = j; } 
    void set_k(char k) { data.k = k; } 

    void update() { constData = data; } 

private: 
    mutable_data const constData; 
    mutable_data data; 
}; 

int main() 
{ 
    my_data d; 
    std::cout << "i: " << d.i() << ", j: " << d.j() << ", k: " << d.k() << std::endl; 

    d.set_i(10); 
    d.set_j(false); 
    d.set_k('z'); 

    std::cout << "i: " << d.i() << ", j: " << d.j() << ", k: " << d.k() << std::endl; 
    std::cout << "===============" << std::endl; 

    d.update(); 

    std::cout << "i: " << d.i() << ", j: " << d.j() << ", k: " << d.k() << std::endl; 
} 
+4

상수를 유지하려고하지 않는 경우 const 대신 const로 표시되는 이유는 무엇입니까? – Adam

+0

데이터 구조에 대한 설명 : 업데이트를위한 스왑과 읽은 스왑의 최상위 수준 포인터가있는 별도의 두 데이터 트리를 유지하는 것이 더 좋지 않습니까? 각 객체 안에 두 세트의 데이터를 보관하는 것이 좋습니다. –

+0

@Adam은 const 객체이기 때문에. 나는 그걸 가지고 노는 것을 아무것도 원하지 않는다 ... 갱신 될 필요가있을 때를 제외하고. 나는 const가 아니라고 선언 할 수 있다는 것을 알지만,이 상황에서는 const가되는 것이 더 적절하다고 느낀다. 아니? –

답변

4

를 사용하여 접근 :

나는 희망 내 말은 분명히 무엇을 만드는 예제 프로그램을 초안 한 .

mutable_data & currentData() { return *currentPtr; } 
const mutable_data & upcomingData() { return *upcomingPtr; } 

void update() { std::swap(currentPtr, upcomingPtr); } 
+0

스와핑이 작동하지 않습니다. 생각하지 않습니다 ... 복사본이 아니어도 되나요? currentData가 프레임 10에 있고 upcomingData가 이제 프레임 11에 있다고 가정합니다. 따라서 스와핑 할 때 다가오는 프레임이 10으로 돌아오고 프레임 11에 있고 프레임 11의 데이터는 프레임 11의 데이터가 쓰여지기 직전입니다. 거기 없어. 말이 돼? 미안해, 설명하기가 어렵다! :) –

+0

@Sam 원한다면 복사도 할 수 있습니다. 필요한지 알기에 충분한 논리를 보여주지 못했습니다. 요점은 포인터가'const'가 아니기 때문에 그 시점에서 무엇이든 할 수 있다는 것입니다. 유일한 제약은'currentData'와'upcomingData'의 소비자에 있습니다. –

+0

나는 네가 옳다고 생각하는 것을 본다. 이것이 최선의 방법 일 것이다. 감사! –

1

이것은 매우 흥미로운 질문입니다. 당신이 얻는 것은 data race의 문제가 동시성에 적합한 조건 하에서 구현 될 때라고 생각합니다.

question에서 논의 된 것처럼 const이 되고자하는 것을 조작하는 한 가지 방법은 변수를 mutable으로 수정하는 것입니다.

물론이 목적을 달성하려면 구조체를 다시 디자인해야합니다. 상기 변수를 초기화하는 방법을 const으로하면 원하는 값을 고정시킬 수 있습니다.

키워드 mutable 외에도 const_cast을 사용하여 변수를 다시 작성하는 방법을 고려해야합니다.

관련 문제