2017-02-06 15 views
1

キーワード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; 
} 
+1

純粋な指定子 '= 0'は本当に代入式ではなく、魔法の構文なので、ゼロを変数に置き換えることはできません。 '#define'は、実際のコンパイラが実行される前に生のテキスト置換を処理するのでうまく動作します。 –

+0

'#define'はプリプロセッサで処理されるので動作しますので、PUREは0に置き換えられ、' virtual float area()= 0'のようにコンパイルされます – Anton

+0

ブライアンは彼の簡潔な解答。これはコードの難読化コンテストでは良い考えです。 –

答えて

15

言語の文法は言う:

ある
pure-specifier: 
    = 0 

、唯一のトークンは=0が許可されています。あなたは識別子をそこに置くことはできません。

#define PURE 0マクロ置換が変換前に行われるため、正常に動作します。

+0

したがって、上記のようにキーワード '' PURE''を使用したい場合、私はオプションがありません。私は '' #define''を使う必要がありますか? – kmiklas

+7

@kmiklasはい、でも、あなたはそれをしてはいけません。それはあなたのコードを読んでいる人を混乱させるでしょう。彼らは 'ピュア'が単に '0'を意味するのか、それとも他の魔法を呼び出すのか疑問に思うでしょう。 – Brian

-1

@Brianの回答とコメントに追加するだけで、これはまずは​​お勧めできません。それは実際にその言語を理解し、価値を全く追加せず、有用な目的を果たしていない人にとっては、より少なく、です。ちなみに、CS(特に関数言語)の「純粋」という言葉は、ではありません。は、C++で使用されている「純粋な仮想」と同義語または同等です(他の「抽象的な」または「インタフェース」など)言語)、潜在的な付加的な欠点として用語の混乱を投げる。

一部の人々は、このようなものでパスカルのような言語から「C」への移行を希望するために使用:

#define BEGIN { 
#define END } 
// etc... 

それは厄介です。どの言語でも悪いことです。 この場合、C++を使用しています。したがって、C++構文を使用してください。獣の美しさを抱きしめてください:)

申し訳ありませんが、追加の回答として追加する必要があったので、@ Brianの元の回答は両方とも正確です&簡潔(と私の投票を取得します)。

関連する問題