0

私には2つのクラスがあります。1つと2つで、それぞれが他のクラスへのポインターを持つフレンドメンバー関数を持っています。最初のヘッダーファイルは次のとおりです。

#ifndef FIRSTCLASS_H
#define FIRSTCLASS_H

class two;

class one {

private:
int one_data;

public:
friend void second_data (two *);
};

#endif

2番目のヘッダーファイルは次のようになります。

#ifndef SECONDCLASS_H
#define SECONDCLASS_H

class one;

class two {

private:
int two_data;

public:
friend void first_data (one *);
};

#endif

実際の関数は、3番目の.cppファイルにあります。適切なクラス修飾子を使用して関数を記述しましたが、コンパイルエラーが発生します。私はg++を使用しています。機能は次のとおりです。

#include "firstclass.h"
#include "secondclass.h"

void two::first_data (one * class1) {

}

 void one::second_data (two * class2) {

}

エラーは次のとおりです。

 error:no ‘void two::first_data (one*)’ member function declared in class ‘two’ 
 error: no ‘void one::second_data(two*)’ member function declared in class ‘one’

関数名の前にクラス修飾子をドロップすると、コードがコンパイルされます。変更された機能は次のとおりです。

 void first_data(one * class1) {

 }

 void second_data(two * class2) {

 }

私はC++を初めて使用しますが、最初のケースで何か間違ったことをしているのかどうかわかりません。教えてください。

4

2 に答える 2

5

あなたが宣言するのは、あなたのクラスの友達としての独立した関数です。
それらは実際にはどのクラスのメンバーでもありません。

friend void first_data (one *); 

独立した関数をクラスのフレンドとして宣言しますが、クラスのメンバー関数であるfirst_dataことを意味するものではありません。first_dataしたがって、cpp ファイルで関数を定義すると、コンパイラは関数が宣言されていないと不平を言います。

また、

void two::first_data (one * class1){}

Returntype ClassName ScopeResolution FunctionSignature

two::関数がこの特定のクラスに属していることをコンパイラに伝えます。これは名前空間の仕様ではなく、クラス修飾です。

于 2012-10-01T12:35:14.950 に答える
2

それは ではなくnamespaceclass修飾子です。

void two::first_data (one * class1) {

}

first_dataclass からメソッドを定義しtwoます。

ただし、無料の関数をフレンドとして宣言しましたfirst_data:

friend void first_data (one *);

これは同じではありません。無料の関数を友達として使いたい場合は、friend既に持っている宣言を使用してください。そうでない場合は、同様にメソッドをフレンドとして宣言できます。

friend void two::first_data (one *);
于 2012-10-01T12:36:07.130 に答える