为什么不能将"PURE"定义为const设置为0以识别纯虚拟类?

kmi*_*las 1 c++ pure-virtual

尝试将关键字定义PURE为const集0,以用作抽象数据类型的类的标识符.为什么不编译?Per Meyers在"Essential C++,topic 1"中,我更喜欢使用const而不是#define,就像这样:

const int PURE = 0;
virtual void myFunction() = PURE;
Run Code Online (Sandbox Code Playgroud)

唉,这会引发错误(在Apple LLVM 7.0和gcc上也是如此):

Initializer on function does not look like pure-specifier
Run Code Online (Sandbox Code Playgroud)

下面是一个例子,标有A,B和C三种技术;

1. const int PURE = 0 will not compile
2. #define PURE 0 compiles and runs fine
3. Simply setting function = 0 (Stroustrup) works fine.
Run Code Online (Sandbox Code Playgroud)

它现在设置使用const解决方案,因此不会编译.简单地评论/取消注释第4,5,11和12行,以检查三种不同的方法:

#include <iostream>
#include <string>

const int PURE = 0;                  // Case B
// #define PURE 0                       // Case C

const float PI = 3.14159;

class Shape {
public:
//    virtual float area() = 0;     // Case A: Compiles
    virtual float area() = PURE;    // Case B: This does not compile
                                    // Case C: Compiles
};
class Circle: public Shape {
public:
    Circle(float radius):radius_(radius) {}
    float area() { return PI * radius_ * radius_; }
private:
    float radius_;
};
class Rectangle : public Shape {
public:
    Rectangle(float base, float height):base_(base),height_(height) {}
    float area() { return base_ * height_; }
private:
    float base_;
    float height_;
};
int main(int argc, const char * argv[]) {
    Circle c(3);
    Rectangle r(3,5);

    std::cout << "Circle Area:    \t" << c.area() << std::endl;
    std::cout << "Rectangle Area: \t" << r.area() << std::endl;

    std::cout << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 15

语言语法说:

pure-specifier:
    = 0
Run Code Online (Sandbox Code Playgroud)

也就是说,只= 0允许令牌.你不能在那里放一个标识符.

#define PURE 0 工作正常,因为宏替换发生在翻译之前.

  • @kmiklas是的,但你也不应该这样做.它会让读取代码的人感到困惑.他们会怀疑`PURE`是否意味着'0'或者它是否会引发其他魔法. (7认同)