キーワードPURE
をconstとして設定して、抽象データ型であるクラスの識別子として使用する0
を設定しようとしています。なぜこれはコンパイルされませんか?でパーマイヤーズ「エッセンシャルC++、トピック1、」私はそうのように、#defineしとは対照的にconst
を使用することを好むだろう:純粋な仮想クラスを識別するために、 "PURE"を0に設定されたconstとして定義できないのはなぜですか?
const int PURE = 0;
virtual void myFunction() = PURE;
ああ、これは(アップルLLVM 7.0とgccで同じ)のエラーがスローされます。
Initializer on function does not look like pure-specifier
以下の例は、A、B、およびCとラベル付けされた3つの技術を使用しています。
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は、3つの異なる方法を検討します
#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
ブライアンは彼の簡潔な解答。これはコードの難読化コンテストでは良い考えです。 –