아래 코드에서 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;
}
왜냐하면 '#if 0'때문입니까? 어쨌든, 그것은 간단한 오류에 대한 코드가 많이 보입니다. 어쩌면 이것이 다운 폰트의 이유일까요? – nha
의도적으로 제 요점을 분명히했습니다. 나는 기능적 선언을하고 있기 때문에 정의가 명백하다. 그러나 나는이 오류를 밝혀 내기 위해 같은 것을 주석을 달았다. 제대로 대답하지 않으면 downvotes가 받아 들여지지 않는다. :) 나는 이미이 점을 매우 분명하게 지적했다. "여기 Factory는 추상적 인 클래스가 아니기 때문에 이상적으로 인스턴스화가 가능하다.이 함수가 제거되고 순수한 가상 createButton 만 추가되면이 오류가 발생하지 않는다. 유효한 행동 " – user2997518
글쎄, 아마도 혼란스러워하지 않는 것 같아서 질문을 편집해야한다. ("if 0 ...' "? 나는 그런데 downvote하지 않았다. – nha