Method for solving error: “cannot instantiate abst

2019-01-25 06:59发布

问题:

I find one of the most time-consuming compiler errors for me is "cannot instantiate abstract class," since the problem is always that I didn't intend for the class to be abstract and the compiler doesn't list which functions are abstract. There's got to be a more intelligent way to solve these than reading the headers 10 times until I finally notice a missing "const" somewhere. How do you solve these?

回答1:

cannot instantiate abstract class

Based on this error, my guess is that you are using Visual Studio (since that's what Visual C++ says when you try to instantiate an abstract class).

Look at the Visual Studio Output window (View => Output); the output should include a statement after the error stating:

stubby.cpp(10) : error C2259: 'bar' : cannot instantiate abstract class
due to following members:
'void foo::x(void) const' : is abstract
stubby.cpp(2) : see declaration of 'foo::x'

(That is the error given for bdonlan's example code)

In Visual Studio, the "Error List" window only displays the first line of an error message.



回答2:

C++ tells you exactly which functions are abstract, and where they are declared:

class foo {
        virtual void x() const = 0;
};

class bar : public foo {
        virtual void x() { }
};

void test() {
        new bar;
}

test.cpp: In function ‘void test()’:
test.cpp:10: error: cannot allocate an object of abstract type ‘bar’
test.cpp:5: note:   because the following virtual functions are pure within ‘bar’:
test.cpp:2: note:       virtual void foo::x() const

So perhaps try compiling your code with C++, or specify your compiler so others can give useful suggestions for your specific compiler.




回答3:

C++Builder tells you which method is abstract:

class foo {
    virtual void x() const = 0;
};

class bar : public foo {
    virtual void x() { }
};

new bar;

[BCC32 Error] File55.cpp(20): E2352 Cannot create instance of abstract class 'bar'
[BCC32 Error] File55.cpp(20): E2353 Class 'bar' is abstract because of 'foo::x() const = 0'