Подтвердить что ты не робот

Нужен ли мне файл .cpp для абстрактного класса?

Во-первых, я новичок в С++. Я открываю файл заголовка для каждого класса С++. Теперь я нуждаюсь в создании абстрактного класса. Ниже приведен мой код

magic.h

#pragma once
class Magic
{
public:
    Magic(void);
    ~Magic(void);
    virtual void display()=0;
};

Magic.cpp

#include "Magic.h"


Magic::Magic(void)
{
}


Magic::~Magic(void)
{
}

Теперь, как вы знаете, я не могу добавить следующее в файл cpp.

Magic::display()
{
}

Итак, действительно ли мне нужен .cpp файл для абстрактного класса? Или еще, я неправильно вызываю display() в .cpp файле?

Пожалуйста, помогите.

4b9b3361

Ответ 1

Вам не нужен файл реализации. Просто определите все необходимые члены inline (и не определяйте чистые виртуальные, если вам это не нужно).

class Magic
{
public:
    Magic(void) {};
    ~Magic(void) {};
    virtual void display()=0;
};

Ответ 2

Если вы следуете соглашениям 2-files-per-class и one-class-in-each-set-of-files, было бы лучше иметь файл .cpp, даже если вы пишете абстрактный класс.

Есть несколько других преимуществ, помимо сохранения согласованности: наличие файла .cpp или реализации дает вам пространство для расширения в будущем, если вы хотите добавить не виртуальное общее поведение к вашему семейству классов, база класс - это правильное место для его добавления. Также незначительные изменения в файле .cpp приведут к значительно меньшему времени компиляции, чем к .h, которые включены из нескольких мест.

В противном случае вы можете разместить класс (абстрактное или нет) только в одном файле .h. Такие библиотеки, как STL, делают это все время.

Ответ 3

Нет, вы можете добавить функцию definition для чистой виртуальной функции, но обычно вам не нужно предоставлять определение функции для чистой виртуальной функции. Обратите внимание: вам не нужен тип возвращаемого значения функции для Magic::display(), должен быть:

void Magic::display()
{
}

Ответ 4

Вам не нужен исходный файл для абстрактных классов (например, интерфейс).

Кроме того, если у вас есть виртуальный метод любого типа, вы должны добавить деструктор virtual (или сделать защищенный деструктор). Также вы можете просто дать компилятору создать для вас конструктор по умолчанию. Если вам нужна чистая виртуальная функция (что производный класс ДОЛЖЕН переопределить) вам не следует добавлять тело функции, поэтому оставьте void Magic::display() {} прочь. И поскольку вы должны предоставить тело деструктора, вы можете определить его в строке:

struct Magic {
    // use default constructor
    virtual void display() =0; // pure virtual function
    virtual ~Magic(); // virtual destructor
};

inline Magic::~Magic()
{
}

или даже проще:

#pragma once

struct Magic {
    virtual void display() =0;
    virtual ~Magic() {}
};

Ответ 5

Если ваш класс содержит только виртуальные методы, он фактически определяет интерфейс. Интерфейс по своей природе представляет собой контракт между двумя объектами без какой-либо зависимости от реализации. Поэтому, как хорошая проектная практика, вам не нужен только файл .cpp, лучше без него.

Поскольку вы используете VS, вы также можете использовать расширение MS __ interface для интерфейсов вместо классов с чистыми виртуальными методами (будьте осторожны, это не переносимый).