如果我能够或不能实例化(抽象)类,请在运行时检查

时间:2016-02-01 21:53:32

标签: c++ class oop abstract

让我说我有:

class A:
{
public:
A();
virtual void foo();
};

class B:public A
{
public:
B();
void foo();
};

class C:public A
{
public:
C();
void foo();
};

并在主

if(is_abstract<A>::value==false)
{
   int option;
   cout<<"What type of object do you want to create? 0-A,1-B,2-C";
   cin option;
   if(option==0)
      A *a = new A();
   if(option==1)
      B *b = new B();
   else
      C *c = new C();
}
else
{
   int option;
   cout<<"What type of object do you want to create? 1-B,2-C";
   cin option;
   if(option==1)
      B *b = new B();
   else
      C *c = new C();
}

在当前状态下,代码可以正常工作。如果我使虚拟void foo()= 0,A变成抽象类,我得到编译时错误,因为我无法在A * a = new A()实例化抽象类。有没有办法绕过这个编译时错误?感谢

1 个答案:

答案 0 :(得分:2)

在当前形式中,将生成尝试实例化A的代码(尽管从未调用过)。即使编译器由于优化而不会生成代码,非生成的代码仍然必须是有效的,而你的代码不是。

要解决此问题,您必须使用某种形式的SFINAE来确保从未生成尝试实例化A的代码。像这样:

void make(std::enable_if_t<std::is_abstract<A>::value>* = nullptr) {
   ... (the code which never creates A)
}

void make(std::enable_if_t<!std::is_abstract<A>::value>* = nullptr) {
   ... (the code which does create A)
}

...
make();