Попытка определить ключевое слово PURE
как const, установленное на 0
, для использования в качестве идентификатора для классов, которые являются абстрактным типом данных. Почему это не компилируется? За Мейерс в "Essential C++, в разделе 1," Я предпочел бы использовать const
в отличие от #define, например, так:Почему «PURE» не может быть определено как const, установленное в 0, чтобы идентифицировать чистые виртуальные классы?
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;
}
Чистый спецификатор '= 0' на самом деле не является выражением присваивания, это просто волшебный синтаксис, поэтому вы не можете заменить ноль переменной; '# define' отлично работает, потому что он работает через необработанную подстановку текста до запуска реального компилятора. –
'# define' работает, потому что обрабатывается препроцессором, поэтому PURE заменяется на 0 и скомпилируется как' virtual float area() = 0' – Anton
Я хотел бы повторить комментарий, который Брайан сделал на его сжатом ответе , Это только хорошая идея в конкурсе по обфускации кода. –