2010-12-11 2 views
4


저는 C++을 처음 사용하고 텍스트 파일에서 명령을 읽을 거북이 에뮬레이터를 구현하려고합니다. 벡터에 넣고 글랏
을 사용하여 그립니다. 노드 클래스, 노드에서 파생 된 명령 클래스, 명령에서 4 파생 클래스 (전달, 왼쪽, 오른쪽, 점프, 반복) 및 명령 저장에 사용되는 Prog 클래스가 있습니다. |파생 된 클래스 멤버에 액세스하기위한 추상 클래스에 대한 포인터의 벡터

class node 
{ 
    public: 
     node(); 
     virtual ~node(); 
     virtual void Run()=0; 
}; 

class command : public node 
{ 
    private: 
     float v; 
    public: 
     command(); 
     command(float); 
     ~command(); 
     virtual void Run(); 
     friend istream& Prog::operator>> (istream& in, Prog& pro); 
}; 

class Repeat : public command 
{ 
    private: 
     Prog pg; 
    public: 
     Repeat(float value, istream& in); 
     ~Repeat(); 
     void Run(); 
     friend istream& Prog::operator>> (istream& in, Prog& pro); 
}; 

class Prog 
{ 
    private: 
     vector<node*> listing; 
    public: 
     Prog(); 
     ~Prog(); 
     void Run(); 
     friend istream& operator>> (istream& in, Prog& pro); 
}; 

지금 우리는 4 번 다음 명령 을 반복해야 자신의 values.for의 예를 반복 한 다음 임시 벡터에서 명령을 파일에서 읽고 쓸 수 있습니다 반복 | 4 | 앞으로 | 4 | 왼쪽 | 40 | 앞으로 | 10
우리는 4 개의 파생 된 클래스의 Run 함수를 호출하고 사용할 수있는 기본 클래스 객체에 대한 Prog 클래스 포인터 안에 목록 벡터를 추가하려고합니다. 다형성
내 문제는 내가 사용하는 것입니다. 내 임시 벡터를 통해 이동하고 찾을 각 명령에 대한 개체를 만들 때 동적 이름을 사용할 수 없기 때문에 (나는 생각한다) 같은 이름을 사용할 수 있지만 나는 각 새 전달 명령을 fw 개체를 덮어 쓸 것이라고 생각합니다

else if (command=="FORWARD") 
    { 
     Forward::Forward fw(value); 
     node* ptr; 
     ptr= &fw; 
     pro.push_back(ptr); 
     text.erase (text.begin(), text.begin()+2);*/ 
    } 

나는 다음과 같은 것을 사용하려고하지만 올바른 방법

else if (command=="FORWARD") 
    { 
     Forward::Forward fw(value); 
     new Forward(fw); 
     node* ptr; 
     ptr= &(??); 
     pro.push_back(ptr); 
     text.erase (text.begin(), text.begin()+2);*/ 

}

내가 원하는 걸 할 수있는 방법이를 찾을 수 없습니다? 결국 우리는 음식물을 호출 할 :: 내가 선언 한 친구의 기능에 대한이

void Prog::Run() 
{ 
     vector<node*>::iterator it; 
     for (it=listing.begin();it!=listing.end();it++) 
     listing[it]->Run(); 
} 

도 뭔가처럼 보일 것이고, 그것이 바로 확실 종료하지 메신저 실행 : 내가 PROG 클래스에 friend istream& operator>> (istream& in, Prog& pro); 정의를 방금 다른 두 클래스에서 선언했거나 각 클래스에 대해 정의하고 각 클래스에 다른 두 번째 인수가 필요합니까 ??
미리 감사드립니다.

답변

2

설명 내용에 따라 pro.push_back(new Forward(value));을 (를) 찾고 있습니다.

또한 비공개 멤버가 액세스 할 수있는 모든 클래스에서 함수 또는 클래스를 friend로 선언해야합니다.

+0

with pro.push_back (새 전달 (값)); 값으로 생성 된 객체에 대한 포인터 또는 벡터에 삽입 된 실제 객체에 대한 포인터가 있습니까? – pmantz

+0

이 코드는 ** 하나 ** 객체 (값으로 생성됨) 만 생성하므로 벡터의 포인터가 해당 객체를 가리 킵니다. –

관련 문제