2012-03-24 1 views
0

나는 이러한 유형의 멤버 포인터를 가지고 :새 개체 인스턴스화. 이것이 맞는지 확실하지 않은가요?

const TopState<TestHSM>* state_; 

state_ 다형성 타입이다.

template<typename H> 
struct TopState { 
//... functions etc 
}; 

이 계층의 비트가 추상적없는 마지막 LeafState있는 :

//indentation to indicate state nesting 
typedef CompState<TestHSM,0>  Top; 
typedef CompState<TestHSM,1,Top> S0; 
typedef CompState<TestHSM,2,S0>  S1; 
typedef LeafState<TestHSM,3,S1>   S11; 
typedef CompState<TestHSM,4,S0>  S2; 
typedef CompState<TestHSM,5,S2>   S21; 
typedef LeafState<TestHSM,6,S21>   S211; 
:
template<typename H, unsigned id, 
typename B=CompState<H,0,TopState<H> > > 
struct LeafState : B { 
    //...functions 
    static const LeafState obj; 
}; 

다음 개체

상태를 나타냅니다

TopState

은 기본입니다

참고 만 S11S211 (LeafState ')을 인스턴스화 할 수 있습니다.

class TestHSM { 
public: 
TestHSM() { 
    state_ = new S11; 
} 

//fix destruction - problem 
~TestHSM() { 
    //reset to s11 
// state_ = &S11; 
// delete state_; 
// state_ = 0; 
} 

void next(const TopState<TestHSM>& state) 
{ 
    state_ = &state; 
} 

private: 
const TopState<TestHSM>* state_; 
}; 

내 문제는 지금 state_ 개체의 창조 :

나는이처럼 보이는 TestHSM 클래스가 있습니다. 위의 생성자를 참조하십시오. 이 방법이 올바른 방법 일지는 모르겠지만 완전히 효과가 있습니까?

S11은 개체를 인스턴스화 할 수있는 첫 번째 상태이며 내 프로그램에서는 S11이 시작시 첫 번째 상태입니다. 코드는 예상대로 작동합니다. 또는 어쨌든 것 같습니다. 하지만 이것이 주먹구구 한 상태를 보여주기위한 최적의 방법이라고 생각하지 않습니까?

또한이 작업을 수행하면 state_을 삭제하려고 할 때 힙 메모리 런타임 오류가 발생합니다. 소멸자 코드를 참조하십시오.

제안 사항?

앵거스

+0

코드를 최소화 할 수 있습니까? –

답변

0

개체 구성 및 사용법이 정확하고 표준 C++입니다. 유일한 문제는 작성한 파손 코드입니다. 당신은 타입의 포인터를 잡으려고합니다. 이것은 작동하지 않을 것이고 컴파일러는 그렇게하지 않을 것입니다. 소멸자는 메모리를 해제하는 것만 큼 간단해야한다 : 이전 상태를 삭제 상태를 변경할 때

~TestHSM() { 
    if (state_) { 
    delete state_; 
    state_ = 0; 
    } 
} 

는 또한해야합니다. 나는. 당신은 항상 다음 함수에 상태 new을 사용하여 구성을 전달하고 그것이 필요 때 TestHSM 무료하도록해야

void next(TopState<TestHSM> *state) 
{ 
    if (state_) 
     delete state_; 
    state_ = state; 
} 

:

int main() { 
    TestHSM test; 
    test.next(new S211()); 
    // No freeing, TestHSM destructor frees everything 
} 
0

발표 클래스 TestHSM 다음() 함수는 다음과 같이한다 the rule of three을 따르지 않습니다. 복사 생성자 및 복사 할당 연산자가 없거나 복사를 금지하는 방법입니다.

가장 좋은 방법은 다른 사람이 리소스 관리를 처리하도록하는 것입니다. 예를 들어 std::unique_ptr 또는 boost::scoped_ptr 명의 회원을 사용하십시오. 이 두 가지 옵션 중 하나는 TestHSM 사본을 금지합니다.복사 기능이 필요한 경우 상태에 대한 가상 복사 메커니즘 (예 : clone() 구성원 기능)과 함께 복사 생성자를 직접 작성해야합니다.

관련 문제