2015-01-02 3 views
-2

아래 코드에서 GUIFactory 클래스에 순수 가상 함수 createImage를 추가하는 중 오류가 발생합니다.추상 형식의 개체를 할당 할 수 없습니다

오류 : 너무 이상적으로 그것은 인스턴스화해야하는 추상 클래스가 아닌 추상 형식 '공장'여기

공장의 객체를 할당 할 수 없습니다. 이 함수를 제거하고 순수 가상 createButton 만 추가하면 올바른 동작으로 보이는이 오류가 발생하지 않습니다.

코드 :

#include <iostream> 
#include<string.h> 
using namespace std; 
class Button { 
public: 
    virtual void paint() = 0; 
}; 

class Image { 
public: 
     virtual void paint() = 0; 
}; 

class OSXButton: public Button { 
public: 
    void paint() { 
     std::cout << "OSX button \n"; 
    } 
}; 

class WindowsButton: public Button { 
public: 
    void paint() { 
     std::cout << "Windows button \n"; 
    } 
}; 

class iPhoneButton: public Button { 
public: 
    void paint() { 
     std::cout << "iPhone button \n"; 
    } 
}; 

class OSXImage: public Image { 
public: 
     void paint() { 
       std::cout << "OSX button \n"; 
     } 
}; 

class WindowsImage: public Image { 
public: 
     void paint() { 
       std::cout << "Windows button \n"; 
     } 
}; 

class iPhoneImage: public Image { 
public: 
     void paint() { 
       std::cout << "iPhone button \n"; 
     } 
}; 


class GUIFactory { 
public: 
    virtual Button *createButton(const char *) = 0; 
     virtual Image *createImage(const char *) = 0;//If this function is commented code works fine. 
}; 

class Factory: public GUIFactory { 
public: 
    Button *createButton(const char *type) { 
     if(strcmp(type,"Windows") == 0) { 
      return new WindowsButton; 
     } 
     else if(strcmp(type,"OSX") == 0) { 
      return new OSXButton; 
     } 

       else if(strcmp(type,"iPhone") == 0) { 
         return new iPhoneButton; 
       } 
       else 
       { 

       return NULL; 
       } 




    } 

#if 0 
Image *createImage(const char *type) { 
       if(strcmp(type,"Windows") == 0) { 
         return new WindowsImage; 
       } 
       else if(strcmp(type,"OSX") == 0) { 
         return new OSXImage; 
       } 

       else if(strcmp(type,"iPhone") == 0) { 
         return new iPhoneImage; 
       } 
       else 
       { 

       return NULL; 
       } 




     } 

#endif 


}; 

int main() 
{ 
    GUIFactory* guiFactory; 
    Button *btn; 
     Image *img; 

    guiFactory = new Factory; 

    btn = guiFactory->createButton("OSX"); 
     if(btn!=NULL) 
     { 
    btn -> paint(); 
     } 

    btn = guiFactory->createButton("Windows"); 
     if(btn!=NULL) 
     { 
     btn -> paint(); 
     } 

     btn = guiFactory->createButton("iPhone"); 
     if(btn!=NULL) 
     { 
     btn-> paint(); 
     } 

     #if 0 
     img = guiFactory->createImage("OSX"); 
     if(img!=NULL) 
     { 
     img -> paint(); 
     } 

     img = guiFactory->createImage("Windows"); 
     if(img!=NULL) 
     { 
     img -> paint(); 
     } 

     img = guiFactory->createImage("iPhone"); 
     if(img!=NULL) 
     { 
     img -> paint(); 
     } 




     //btn -> paint(); 
     #endif 
     delete guiFactory; 
     // delete Button; 
    return 0; 
} 
+0

왜냐하면 '#if 0'때문입니까? 어쨌든, 그것은 간단한 오류에 대한 코드가 많이 보입니다. 어쩌면 이것이 다운 폰트의 이유일까요? – nha

+0

의도적으로 제 요점을 분명히했습니다. 나는 기능적 선언을하고 있기 때문에 정의가 명백하다. 그러나 나는이 오류를 밝혀 내기 위해 같은 것을 주석을 달았다. 제대로 대답하지 않으면 downvotes가 받아 들여지지 않는다. :) 나는 이미이 점을 매우 분명하게 지적했다. "여기 Factory는 추상적 인 클래스가 아니기 때문에 이상적으로 인스턴스화가 가능하다.이 함수가 제거되고 순수한 가상 createButton 만 추가되면이 오류가 발생하지 않는다. 유효한 행동 " – user2997518

+0

글쎄, 아마도 혼란스러워하지 않는 것 같아서 질문을 편집해야한다. ("if 0 ...' "? 나는 그런데 downvote하지 않았다. – nha

답변

1

createImage의 정의 주위 #if 0#endif를 제거합니다.

그들의 존재가 정의를 제거하므로 Factory은 순수 가상 함수를 대체하지 않으며 여전히 추상입니다.

+0

또한 멤버 함수로 만들어야합니다. –

+0

@CaptainObvlious : 이미 들여 쓰기가 잘못되어 있고, 미묘한 수직 공백으로 인해 볼 때 더욱 어려워졌습니다. –

+0

아, 맞습니다. Facepalm! –

관련 문제