3

Bruce eckel による Thinking in C++ には、次のようにフレンド関数に関する例が示されています。

// Declaration (incomplete type specification):
struct X;
struct Y {
void f(X*);
};
struct X { // Definition
private:
int i;
public:
friend void Y::f(X*); // Struct member friend
};
void Y::f(X* x) {
x->i = 47;
}

今、彼はこれを説明しました:

Y::f(X*) は X オブジェクトのアドレスを取ることに注意してください。型のサイズに関する完全な情報がなくても、渡されるオブジェクトに関係なく固定サイズのアドレスを渡す方法をコンパイラが常に認識しているため、これは重要です。ただし、オブジェクト全体を渡そうとする場合、コンパイラは、Y::g(X) などの関数を宣言できるようにする前に、X の構造定義全体を確認して、サイズとその渡し方を知る必要があります。

しかし、私が試したとき

void f(X);  

構造体 Y の宣言のように、エラーは表示されません。理由を説明してください。

4

3 に答える 3

1

不完全なオブジェクトを値で渡すことは問題ありませんがX、関数の実装中に、X型のオブジェクトXが実際に関数で使用されているかどうかに関係なく、完全な型を使用できる必要があります。関数宣言は、そのような戻り値の型が完全な型でなければならない共変の戻り値の型 (メンバー関数の場合) を除いて、引数または戻り値の型として不完全なオブジェクトを使用しても問題ありません。

于 2010-05-04T17:57:48.450 に答える
1

関数宣言のパラメーターの型が不完全な場合があります。

ただし、データ メンバーの宣言とすべての定義については、型が完全である必要があります。

struct A;
struct B {
    void f(A);   // declaration, fine
    void g(A) {} // error
    A a;         // error
};
于 2010-05-04T18:00:25.443 に答える
0

問題は、構造体Xの宣言を変更するときです。

したがって、構造体X内で、構造体にはX型の何かを受け取る関数があることをコンパイラに伝えますが、ちょっと待ってください。この時点では、X型は完全には定義されていません。

関数fのパラメーターとして不完全な型を使用することはできませんが、不完全な型のアドレス、つまりX*を使用することはできます。

サイトノートでは、あなたがあなたの将来の質問に対する答えを得ることができるようにあなたがあなたの受け入れ率を上げることは非常に重要であり、私が正しい答えを得たなら私のエゴにとって重要です:)

于 2010-05-04T17:45:48.333 に答える