【问题标题】:Cannot instantiate abstract class?无法实例化抽象类?
【发布时间】:2019-01-03 20:40:36
【问题描述】:

我知道了:

class Core
{
protected:
    static unsigned int id_seed;
    unsigned int id;
    std::string status;

public:
    friend class CPU;
    Core();
    ~Core();

    virtual void procesare(std::string aplicatie) = 0;
};


class CoreScreen: public Core
{
public:
    CoreScreen();
    ~CoreScreen();

    void procesare(std::string aplicatie);
};

和 corescreen.cpp:

#include "CoreScreen.h"

CoreScreen::CoreScreen()
{
}

CoreScreen::~CoreScreen()
{
}

void CoreScreen::procesare(std::string aplicatie)
{
    std::string buffer;
    std::ifstream file_in(aplicatie);
    if (file_in.is_open()) {
        std::cout << "Aplicatia " << aplicatie << " ruleaza: " << std::endl;
        while (getline(file_in, buffer)) {
            std::cout << buffer;
        }
        file_in.close();
    }
    else {
        throw new CExceptie(APP_FAIL, " Aplicatia nu a putut rula!");
    }
}

当我在 main 中使用时:

CoreScreen CS1, CS2, CS3, CS4;

我收到此错误:“核心”无法实例化抽象类。

有什么问题?我以为我在 CoreScreen 中正确声明了我的虚函数。

【问题讨论】:

  • 您已将其声明为纯虚拟。我很惊讶你竟然允许实现它。去掉声明中的= 0。
  • @Gabriel Stoica - 你解决了这个问题吗?您发布的代码看起来不错,包括void procesare()。我相信问题出在“其他地方”。问:您是否在任何地方直接使用“核心”?问:你能发布给出错误的确切行吗?

标签: c++ class abstract instantiation


【解决方案1】:

我想你知道,“核心”是一个abstract class,因为它有一个pure virtual function:virtual void procesare(std::string aplicatie) = 0;。

我想你也知道你不能实例化一个抽象类:因此你的错误。

问题是:

为什么编译器认为您正在尝试实例化“Core”的实例?

你是吗?

它看起来就像您正在尝试实例化四个 CoreScreen 对象:CoreScreen CS1, CS2, CS3, CS4;。如果是这样,那应该是完全可以的。

你是对的:procesare() 是虚拟的(“纯虚拟”,碰巧)。您确实在 CoreScreen.cpp 中正确地覆盖了它:它不看起来就是问题所在。

问:你有没有在任何地方实现过Core::Core() 和Core::~Core()?如果没有,你是怎么编译的?

问:您是否确定您没有尝试在任何地方(甚至“意外”)创建“Core”实例?

无论如何,以下MCVE 编译并运行良好(Ubuntu 18,GCC 7.3.0):

TestCore.h:

/*
 * TestCore.h
 */
#ifndef TESTCORE_H_
#define TESTCORE_H_

#include <string>

class Core
{
protected:
    static unsigned int id_seed;
    unsigned int id;
    std::string status;

public:
    friend class CPU;
    Core();
    ~Core();

    virtual void procesare(std::string aplicatie) = 0;
};


class CoreScreen: public Core
{
public:
    CoreScreen();
    ~CoreScreen();

    void procesare(std::string aplicatie);
};
#endif /* TESTCORE_H_ */

TestCore.cpp:

/*
 * TestCore.cpp
 */
#include <iostream>
#include <fstream>
#include "TestCore.h"

Core::Core()
{
    std::cout << "Core::Core()..." << std::endl;
}

Core::~Core()
{
    std::cout << "Core::~Core()..." << std::endl;
}

CoreScreen::CoreScreen()
{
    std::cout << "CoreScreen::CoreScreen()..." << std::endl;
}

CoreScreen::~CoreScreen()
{
    std::cout << "CoreScreen::~CoreScreen()..." << std::endl;
}

void CoreScreen::procesare(std::string aplicatie)
{
    std::cout << "CoreScreen::procesare(" << aplicatie << ")"  << std::endl;;
}

int main () {
    std::cout << ">>main()..." << std::endl;
    CoreScreen CS1, CS2, CS3, CS4;
    CS1.procesare("Testing CS1");
    std::cout << "<<main()." << std::endl;
    return 0;
}

样本输出:

>>main()...
Core::Core()...
CoreScreen::CoreScreen()...
Core::Core()...
CoreScreen::CoreScreen()...
Core::Core()...
CoreScreen::CoreScreen()...
Core::Core()...
CoreScreen::CoreScreen()...
CoreScreen::procesare(Testing CS1)
<<main().

您会注意到我实现了 Core::Core() 和 Core::~Core()。如果您不需要它们 - 甚至不要将它们放在您的 .h 类定义中。

'希望有帮助

【讨论】:

  • 你也应该初始化 id_seed 吗?惊讶它的链接。
  • "如果不存在其他初始化,则在创建第一个对象时将所有静态数据初始化为零。"
猜你喜欢
  • 2015-08-04
  • 2017-02-05
  • 2015-10-06
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多