2010-11-28 5 views
16

컴파일시이 오류가 발생합니다. - 다음 가상 함수가 I1 내에서 순수하기 때문에 필드 M1 :: sc를 추상 형식 I1로 선언 할 수 없습니다. 도와주세요.C++ : 필드를 추상 형식으로 선언 할 수 없습니다.

class I1 
    {  
    public: 
     virtual void a(int dir) = 0; 
     virtual void b() = 0; 
     virtual void c() = 0; 

     void a(int dir) { 
     .... 
     } 

     void b() { 
     .... 
     } 

     void c() { 
     .... 
     } 
    }; 

    class I2 : public I1 
    {  
    public: 


     void a(int dir) { 
     .... 
     } 

     void b() { 
     .... 
     } 

     void c() { 
     .... 
     } 
    }; 

    class M1 : public G1 
    { 
    protected: 
    I1 sc; 
    public: 
     int dir = 4; 
     sc.a(dir); 
    }; 

전체 코드는 http://pastebin.com/PFrMTJuF에서 찾을 수 있습니다.

답변

13

Abstract classes은 인스턴스화 할 수 없지만 M1의 모든 인스턴스에 I1의 인스턴스를 임베드하여 컴파일러에 요청하면됩니다.

당신은 주위에 작업 할 수 대신 I1의 인스턴스 (당신이 그를 사용할 수 있는지, 또는 스마트 포인터) 약간의 디자인을 변경하고 포인터을 내장하여 :

class M1 : public G1 
{ 
protected: 
    I1 *sc; 
public: 
    M1(I1 *sc_) { 
     sc = sc_; 
    } 
    void foo() { 
     int dir = 4; 
     sc->a(dir); 
    } 
}; 

편집 : 코드를 읽은 후에는 문제를 해결할 수있는 가장 간단하고 깨끗한 방법은 현재 방을 Execute() 명령에 전달하는 것입니다 (예 :

class ICommand 
{ 
public: 
    virtual ~ICommand() 
    { 
    } 

    virtual void Execute(Room *room) = 0; 
}; 


class MoveCommand : public GameCommand 
{ 
public: 
    MoveCommand() 
    { 
    } 

    void Execute(Room *room) 
    { 
     // Do something with `room`... 
    } 
}; 


void Game::HandleInput() 
{ 
    // Read command from user and generate a command object from it. 
    ICommand *pCommand = ParseCommand(Input::ReadCommand()); 
    if (pCommand) { 
     pCommand->Execute(GetCurrentRoom()); // Pass current room to command. 
     delete pCommand; 
    } 
} 
+0

sc_가 무엇을 나타 냅니까? 저렇게 사용할 수 있을까요? – user522767

+0

@user,'sc_'는'M1' 인스턴스를 생성하는 데 필요한 생성자 매개 변수입니다. 필자의 예에서는 'I1'에서 파생 된 구체적인 클래스의 인스턴스를 가리켜 야하고'a() ','b() '및'c() '구현을 제공해야합니다. 예 : 'I2' 인스턴스가 작동합니다. –

+0

내 코드를 보내 주시겠습니까? 저는 C++을 처음 접했고 프로젝트에 몇 개의 파일이 함께 링크되어 있기 때문에 모든 것을 설명 할 수는 없습니다. – user522767

7

I1은 순수한 가상 함수 (= 정의가없는 함수)를 가지고 있기 때문에 추상 클래스입니다.

추상 클래스의 인스턴스를 만들 수 없으므로 (예 : ?!) I1 a과 같은 선언이 작동하지 않습니다.

질문을 편집 한 후에는 I1이 메소드의 정의를 제공 한 이후 추상적 클래스가 아니어야합니다. 그렇다면 메서드 선언 다음에 = 0을 제거하면 코드가 작동합니다.

+0

무엇을 할 수 있습니까? 제발 조언. – user522767

+1

일반적인 해결 방법은 (스마트) 포인터를 사용하는 것입니다. 해당 포인터를 초기화 할 때 비 추상 파생 클래스의 인스턴스를 만듭니다. 포인터는 더 일반적인 (그러나 추상적 인) 경우로 암시 적으로 변환됩니다. 이것은 실제 인스턴스가 메소드 구현을 제공했기 때문에 유효합니다. 포인터 유형이 어떤 구현이 적용되는지 (런타임에 결정될 수 있음) 알지 못하는 경우에도 마찬가지입니다. – Steve314

+0

내 코드를 보내 주시겠습니까? 저는 C++을 처음 접했고 프로젝트에 몇 개의 파일이 함께 링크되어 있기 때문에 모든 것을 설명 할 수는 없습니다. – user522767

1

인스턴스를 추상 클래스 (하나 이상의 순수 가상 함수가있는 클래스)로 만들 수 없습니다. 또 다른 문제가 있습니다. 클래스 선언에서 함수 sc.a(dir)을 호출 할 때 컴파일러에서 수행 할 작업을 원하십니까? 줄 dir = 4 또한 올바르지 않습니다. 클래스의 정적 const 멤버 만 클래스 선언에서 초기화 할 수 있습니다.

+0

사실, int dir = NORTH가됩니다. 여기서 NORTH는 포함 된 파일 중 하나에서 enum에 전역 변수로 정의됩니다. RoomId {EAST, WEST, SOUTH, NORTH} – user522767

관련 문제