我是否需要为抽象类提供.cpp文件?

Pea*_*Gen 22 c++ visual-studio-2010

首先,我是C++的新手.我为每个C++类打开一个头文件.现在我需要创建一个抽象类.以下是我的代码

Magic.h

#pragma once
class Magic
{
public:
    Magic(void);
    ~Magic(void);
    virtual void display()=0;
};
Run Code Online (Sandbox Code Playgroud)

Magic.cpp

#include "Magic.h"


Magic::Magic(void)
{
}


Magic::~Magic(void)
{
}
Run Code Online (Sandbox Code Playgroud)

现在,如您所知,我无法在cpp文件中添加以下内容.

Magic::display()
{
}
Run Code Online (Sandbox Code Playgroud)

那么,我真的需要一个Abstract类的.cpp文件吗?否则,我错误地调用display()了.cpp文件?

Mat*_*Mat 19

不需要实现文件.只需内联定义所有必需的成员(如果不需要,不要定义纯虚拟成员).

class Magic
{
public:
    Magic(void) {};
    ~Magic(void) {};
    virtual void display()=0;
};
Run Code Online (Sandbox Code Playgroud)


Bha*_*hat 10

如果您遵循2-files-per-classone-class-in-each-set-of-files约定,.cpp即使您正在编写抽象类,最好还是有一个文件.

除了保持一致性之外还有一些其他优点:拥有一个.cpp或一个实现文件为将来扩展提供了空间,如果你要为你的类族添加一个非虚拟的常见行为,基类是正确的位置添加它.此外,.cpp文件中的少量编辑将导致编译时间远远少于.h多个地方包含的编辑时间.

除了约定,你可以很好地将一个类(抽象或不抽象)放在一个.h文件中.像STL这样的图书馆一直这样做.

  • +1.我遵循此约定的另一个原因是检查Magic.h是否干净地编译.Magic.cpp只包含单个include.这可以防止难以发现的错误,其中Magic.h依赖于另一个类,无法包含或转发声明它,并且通常间接地拾取它.结果是Foo.cpp可能会编译但Bar.cpp没有编译,你会忽略Magic.h作为原因,因为这两者是共同的. (2认同)