2012-01-11 4 views
10

を考えてみましょクラスの実装ファイル(.CPP)C++での静的メソッドの "静電気" キーワードを使用することはできません

double Vector2::calcDir(double x, double y) 
{ 
    double rad = ...; 
    return rad; 
} 

なぜVector2.cpp内の署名に必要なキーワード静的はないですか?これを試してみると、エラーが発生します:

static double Vector2::calcDir(double x, double y) 

私には矛盾しているようです。メソッドのシグネチャの他の部分はすべて.cppファイル(戻り値の型、メソッド名(duh)、引数の名前と型、定数)で繰り返す必要があります。メソッドが静的であるかどうか(実装を見ているかどうか)を一目で分かりません。

これは必須ではなく、禁止されている理由はありますか?

+1

私はこれが "標準がそう言っているので"と考えます。ちなみに、 'virtual'も同じです。 –

+3

'virtual'も繰り返す必要はありません。過負荷解決(および戻りタイプ)に参加するものだけを繰り返す必要があります。 – pmr

+1

@Nathan Ernst:スタンダードが自分自身で書いたことは決してありませんでした。 – Troubadour

答えて

16

staticはクラス定義で使用すると特別な意味があるからです。クラス定義では、関数を静的メンバー関数として識別します。つまり、クラスインスタンス上では動作しませんが、独立して呼び出すことができます。クラスstatic

外は機能内部リンケージを行いますが、クラスのメンバーは、彼らが(ほとんど常に外部、および確かに外部のメンバーとなっているクラスと同じリンケージを持たなければならないので、これは(さえ静的)メンバ関数では違法ですクラス定義外のメンバ関数を定義できる場合)。

言語の観点からは、クラス定義内のメンバーの宣言は、1つの言語ルールのセットに従います。ここで、staticはその特別なクラスの意味を持ちます。クラス定義の外では、すべての関数定義(メンバーと非メンバー)は同じセットのルールに従います。ここでは、外部リンクを持つクラスのメンバーには無効な意味があります。

+1

「内部リンケージを使用する」という言葉は、「ファイル静的」と呼ばれることがありますか?私はそれがそれと関係があるかもしれないと思った。 –

+0

@SamuelMeacham:はい、「内部結合」の代わりに「ファイル静的」が使用されることがあります。 –

1

これは恐らく混乱を減らすためです。ファイルスコープでは、キーワードは、静的なは「内部リンケージを使用する」(TC++ PL p.200)を意味するのに(混乱して)使用されています。それは、クラスのメンバであっても、現在の翻訳単位内でしかその関数が見えないことを意味する可能性があります。静的な指定子を許可すると、もっと混乱するでしょう。

スタティックを使用して内部リンケージを示すことは推奨されなくなりました。これを達成するには匿名の名前空間を優先する必要があります。

+1

匿名の名前空間で宣言されたエンティティは、静的宣言されていない限り、内部のリンケージを取得せず、翻訳単位固有の名前を取得します。 –

+0

内部リンケージの静的よりも匿名の名前空間が優先される理由はありますか?チャールズのコメントは面白いです。実際には内部のリンケージが必要な場合は静的にする必要があります。 @CharlesBailey、翻訳単位固有の名前を使用しても、内部リンケージの場合と同じ結果が得られますか?意味、人々は、静的なものを使わないことによって、彼らは内部のつながりを得ていないが、気にしないことを認識していますか?私はC++を毎日使っていたのでしばらくしていましたが(私はC#で働いていますが、この言語の深い愛があり、ゲームに戻ってほしい=) –

+1

私が知っている違いはありません。したがって、 " "この標準には、「名前のない名前空間のエンティティは外部リンクを持つことがありますが、翻訳単位固有の名前で修飾されているため、他の翻訳単位では決して見られません」 –

0

2つの非常に異なる機能(グローバル・ツー・オール・クラス・インスタンスとローカル・ツー・ファイルとの比較)を呼び出すのは厄介ですが、次の小さなヘッダーを使用することができます。マクロは空の文字列に展開されるだけです。つまり、実装ファイルのメソッド宣言の前にタグを付けて、コードに戻ってくると、2000行の "boost-esque"ヘッダをなぜコンパイラがこれを使えないのかを調べてください。

staticmethod.h:あなたは

/* 
** macro sugar for maintaining readability 
** of static methods in implementation files 
*/ 
#ifndef STATICMETHOD 
#define STATICMETHOD 

。cppファイルを使用することができます:

#include "staticmethod.h" 
STATICMETHOD double Vector2::calcDir(double x, double y) 
{ 
    double rad = ...; 
    return rad; 
}