Не можете создать экземпляр абстрактного класса? - PullRequest
0 голосов
/ 03 января 2019

Я получил это:

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!");
    }
}

Когда я использую в основном:

CoreScreen CS1, CS2, CS3, CS4;

Я получаю эту ошибку:«Ядро» не может создавать экземпляр абстрактного класса.

В чем проблема?Я думал, что моя виртуальная функция объявлена ​​в CoreScreen правильно.

1 Ответ

0 голосов
/ 04 января 2019

Как я полагаю, вы знаете, что "Ядро" - это абстрактный класс , в силу того, что он имеет чисто виртуальную функцию : virtual void procesare(std::string aplicatie) = 0;.

Полагаю, вы также знаете, что не можете создать экземпляр абстрактного класса: отсюда ваша ошибка.

Вопрос:

Почему компилятор считает, что вы пытаетесь создать экземпляр экземпляра«Ядро»?

Вы?

Это выглядит , как будто вы пытаетесь создать четыре объекта CoreScreen: CoreScreen CS1, CS2, CS3, CS4;.Если это так, то все должно быть в порядке.

Вы правы: procesare() является виртуальным («чисто виртуальный», как это бывает).Вы действительно переопределили его правильно в CoreScreen.cpp: он НЕ выглядит так, как будто это проблема.

В: Вы когда-нибудь реализовывали Core::Core() и Core::~Core() где-нибудь?Если нет, как вы вообще скомпилировали?

Q: Вы SURE не пытаетесь создать экземпляр "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 класса.

'Надеюсь, это поможет

...