gpt4 book ai didi

c++ - 为什么不能将 "PURE"定义为const置0来标识纯虚类呢?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:10:44 24 4
gpt4 key购买 nike

尝试将关键字 PURE 定义为设置为 0 的常量,用作抽象数据类型类的标识符。为什么这不会编译? Per Meyers 在“Essential C++,主题 1”中,我更愿意使用 const 而不是 #define,如下所示:

const int PURE = 0;
virtual void myFunction() = PURE;

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

Initializer on function does not look like pure-specifier

示例如下,使用标记为 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.

它现在使用 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;
}

最佳答案

语言语法说:

pure-specifier:
= 0

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

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

关于c++ - 为什么不能将 "PURE"定义为const置0来标识纯虚类呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42077546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com