2010-05-31 3 views
0

나는 공통 클래스에서 파생 된 두 개의 클래스가 있습니다. 공통 클래스에는 파생 클래스 모두에서 구현되는 execute()라는 순수 가상 함수가 있습니다. 상속 된 클래스에는 벡터 인 특성이 있습니다. 두 가지 execute() 메서드 모두에서이 벡터를 결과로 덮어 씁니다. 객체에 대한 포인터의 벡터에서 두 클래스에 모두 액세스합니다. 개체 외부에서 결과 벡터 폼에 액세스하려고하면 문제가 발생합니다. 하나의 경우 요소 (단순히 포인터)를 얻을 수 있고, 다른 요소에서는 벡터가 비어 있습니다.속성 벡터 자체 비우기

코드 : 나는 무슨 일이 여기에 가고 아무 생각이

class E; 
class A{ 
    protected: 
    vector<E*> _result; 
    public: 
    virtual void execute()=0; 
    vector<E*> get_result(); 
}; 
vector<E*> A::get_result() 
{ 
    return _result; 
} 
class B : public A 
{ 
    public: 
    virtual void execute(); 
}; 
B::execute() 
{ 
    //... 
    _result = tempVec; 
    return; 
} 
class C : public A 
{ 
    public: 
    virtual void execute(); 
}; 
C::execute() 
{ 
    //different stuff to B 
    _result = tempvec; 
    return; 
} 
main() 
{ 
    B* b = new B(); 
    C* c = new C(); 
    b->execute(); 
    c->execute(); 
    b->get_result();//returns full vector 
    c->get_result(); //returns empty vector!! 
} 

... 나는 (벡터와 같은 일 :: 할당을 위반 클래스의 임시 벡터에서 손으로 _result 작성 시도), 아무것도 작동하지 않습니다. 그리고 다른 목적은 완벽하게 작동합니다. 나는 뭔가를 놓치고 있어야합니다 .... 도움이 크게 주시면 감사하겠습니다. 다른 모든 것들 이후

+0

이 코드는 오류를 생성하는 * 실제 * 코드입니까, 근사치입니까? 이 예제는 컴파일되지 않습니다. tempvec/tempVec은 선언되지 않습니다. – SigTerm

답변

3

내가

//different stuff to B 

아마 중요한 라인이라고해야 할 것이다 클래스 BC과 동일합니다!

또한 당신의 get_result() 방법은 정말

const vector<E*>& get_result() const; 

당신이 벡터의 사본 각 시간을 저장해야합니다.

+0

나는 동의한다, 문제는 아마 다른 곳에있다, 보이는 코드는 나에게 완전하게 좋아 보인다. – PeterK

+0

약간의 차이가 있지만, 이들은 다른 벡터 인 tempVec와 tempvec를 처리합니다. – Max

+1

OK 버그를 발견했습니다. 물론 표시된 코드와 아무런 관련이 없습니다. A *의 벡터에서 객체에 액세스하고 있었고 하드 코딩 된 색인이있었습니다. 그래서 그것은 잘못된 물건을보고있었습니다. 일반적으로 나는 시간을 보냈고 여기에 문제를 게시하고 신속하게 문제를 발견했습니다 ... 대단히 고맙습니다! –

0

나는 tempVec이 어디서 왔는지 궁금해했다. 그러나 Troubadour의 응답 후에 나는 코드를 생략하고 있다는 것을 깨달았다. 이 시점에서 코드에 문제가있는 것이 보이지 않기 때문에 문제가있을 것입니다.

+0

OK 버그를 발견했습니다. 물론 표시된 코드와 아무 관련이 없습니다. A *의 벡터에서 객체에 액세스하고 있었고 하드 코딩 된 색인이있었습니다. 그래서 그것은 잘못된 물건을보고있었습니다. 일반적으로 나는 시간을 보냈고 여기에 문제를 게시하고 신속하게 문제를 발견했습니다 ... 대단히 고맙습니다! –

0

나는이 문제를 알고 있다고 생각합니다. B 클래스에서 : :: execute 메서드는 tempVec를 저장하고 (V - 큰), C 클래스에서는 tempvec를 저장합니다. 음, tempVec - 비어 있지 않습니다, tempvec - 비어 있습니다. 틀린 것을 보지 마라.

+0

OK 버그를 발견했습니다. 물론 표시된 코드와 아무 관련이 없습니다. A *의 벡터에서 객체에 액세스하고 있었고 하드 코딩 된 색인이있었습니다. 그래서 그것은 잘못된 물건을보고있었습니다. 일반적으로 나는 시간을 보냈고 여기에 문제를 게시하고 신속하게 문제를 발견했습니다 ... 대단히 고맙습니다! –