2016-09-07 3 views
1

Ogre로 입력을 처리하기 위해 OIS를 사용하고 있으며 현재 KeyPress/Release에서 다음과 같은 메시지 객체가 생성되어 가입자들에게 배포됩니다. 이 객체가 입력이 키보드를 통해 수신 될 때마다 파괴/건설되기 때문에C++ const 멤버가있는 멤버 객체 설정하기

class Message 
{ 
public: 
    Message(); 
    ~Message(); 

    inline void SetKeyEvent(const OIS::KeyEvent& keyEvent) { _keyEvent = keyEvent; } 

    const OIS::KeyEvent& GetKeyEvent() const { return _keyEvent; } 

private: 

    OIS::KeyEvent _keyEvent; 

}; 

, 나는 배포하기 전에, 미리 구성된 메시지 객체를 저장하기 위해 노력하고 단순히 새로운 데이터로 _keyEvent 필드를 업데이트하고 있습니다.

문제는 OIS::KeyEvent 개체에 const 연산자가있어서 할당 연산자를 사용할 수없는 것입니다. SetKeyEvent 메서드를 사용하면 다음과 같은 구문 오류가 발생합니다.

function "OIS::KeyEvent::operator=(const OIS::KeyEvent &)" (declared implicitly) cannot be referenced -- it is a deleted function 

이 기능을 구현하는 가장 좋은 방법은 무엇일까요? 사전에

덕분에

편집 : 그냥 명확히하기 위해 가능하면 이미 초기화 목록을 사용합니다. 제 의도는 Message 객체를 사전 구축 한 다음 SetKeyEvent 메서드를 사용하여 OIS가 발생하는 KeyPress 이벤트의 새 이벤트 데이터로 _keyEvent 필드를 업데이트하는 것입니다. 나는 이것이 가능한지 알고 싶습니다. 그렇다면 그것을하기위한 가장 좋은 방법은 무엇이 될지 알고 싶습니다.

+1

const 멤버가 아닙니다. 그것은'OIS :: KeyEvent'가 할당 연산자를 가지고 있지 않음을 의미합니다. – Hayt

+0

[구성원 초기화 목록을 선호하는 이유는 무엇입니까?] (http://stackoverflow.com/questions/926752/why-should-i-prefer-to-use-member-initialization-list) – LogicStuff

+2

@Hayt const 멤버가 있기 때문에 기본 할당 연산자 *가 없습니다. –

답변

1

복사 연산자가 삭제되므로 포인터로 작업해야합니다.

class Message 
{ 
public: 
    Message(); 
    ~Message(); 

    inline void SetKeyEvent(OIS::KeyEvent* keyEvent) { _keyEvent = keyEvent; } 

    const OIS::KeyEvent& GetKeyEvent() const { return _keyEvent; } 

private: 

    OIS::KeyEvent* _keyEvent; 

}; 

이제 setter의 인수가 nullptr이 아닌지 확인하는 것이 좋습니다.

inline void SetKeyEvent(OIS::KeyEvent* keyEvent) 
{ 
    assert(keyEvent != nullptr); 
    _keyEvent = keyEvent; 
} 

assert()#include <assert.h>

편집이 필요합니다 :

죄송합니다, getter 메소드를 잊어 버렸습니다. 포인터도 사용해야합니다.

const OIS::KeyEvent* keyEvent = &Message.GetKeyEvent(); 

여기에서 Message은 클래스 인스턴스입니다.

+0

이 작업을 수행하지 마십시오.[올바르게] 생성자를 사용하십시오 (http://stackoverflow.com/questions/926752/why-should-i-prefer-to-use-member-initialization-list). –

+0

getter가 호출되고 생성자 호출이 없을 때 오류 메시지가 발생합니다. – pospich0815

+0

어떤 오류 메시지가 나타 납니까? getter에 관한 질문이 있으면 물어보십시오. –

0

그것은 새로운 명시 적 소멸자 호출 배치를 사용하여 가능하다 일들이 당신은 평소해서는 안 :

inline void SetKeyEvent(const OIS::KeyEvent& keyEvent) 
{ 
    _keyEvent.~KeyEvent(); 
    new (&_keyEvent) OIS::KeyEvent(keyEvent); 
} 

이 나쁜 추한 끔찍한 코드는, 당신의 자신의 위험에 사용합니다.