2

私はこのFoo.hのようなものを持つサードパーティによって書かれたクラスを持っています:

class Foo
{
public:
    int Foo::dosomething(float x, float y, float z);

    //Other things here
};

Foo.cpp では、dosomething は次のとおりです。

int Foo::dosomething(float x, float y, float z)
{    
    //Something
}

::ヘッダーの関数名の前にある はどういう意味ですか? 新しいオブジェクトを作成するとき

Foo foo;

次のような dosomething 関数にアクセスできません。

foo.dosomething(1,2,3);

dosomething はどのようにアクセスされることを意図していますか? 次のようにする前に、ヘッダーファイルの :: を削除すると:

class Foo
{
public:
    int dosomething(float x, float y, float z);

    //Other things here
};

Foo 型のオブジェクトから dosomething にアクセスできます。

4

2 に答える 2

5

クラス定義の関数名にスコープを追加するのは正しくありません (多くのコンパイラではエラーと見なされます) 。それはすでにクラスのスコープ内にあるため、基本的に関数スコープをFoo::Foo::dosomething間違っていると定義しています。

class Foo
{
public:
    int Foo::dosomething(float x, float y, float z);   // Shouldn't have Foo::
};

が何をするかという質問に答えるために、関数のスコープ::を指定します。これら2つの機能を考えてみましょう

int dosomething(float x, float y, float z);
int Foo::dosomething(float x, float y, float z);

前者はフリー関数であり、後者はFooクラスのメソッドであり (単語が前に付いていないためstatic) のインスタンスをFoo呼び出す必要があります。

于 2015-06-24T18:02:42.833 に答える
1

一般に、スコープ演算子を既存のクラス スコープに対して使用して、独自のメンバーを参照することは違法ではありません (冗長ではありますが)。::

クラス メンバーの宣言後、そのクラスのスコープ内でメンバー名を検索できます。[注:これは、クラスが不完全なクラスであっても当てはまります。たとえば、 struct X {
enum E { z = 16 };
int b[X::z];         // OK
};
C++11 §3.3.2 ¶5

問題は、宣言のポイントの定義が、それ自体の名前である場合、メンバー宣言でスコープ演算子を使用することを妨げているように見えることです。

名前の宣言のポイントは、完全な宣言子 (第 8 節) の直後で、初期化子(存在する場合) の前です。ただし、以下に示す場合を除きます。[例:
int x = 12;
{ int x = x; }
ここでは、2 番目xが独自の (不確定な) 値で初期化されています。— 例の終了]
C++11 §3.3.2 ¶1

§3.3.2 の残りの部分に続くパラグラフには、クラス メンバーの例外はありません。

上記の制限があっても、クラス メンバーの構文は、メンバー名に修飾 IDを使用することを禁止していません。したがって、示されているコードを受け入れることは構文エラーではありません。しかし、セマンティック違反があり、診断が出力されているはずです。

于 2015-06-24T23:45:34.873 に答える