1

フレンド機能の作業中にいくつかの問題が発生しました。パラメーターに 2 つの異なるクラスを使用するフレンド関数を使用したいと考えています。コードのサンプルは次のとおりです。

ObjectA.h:

#ifndef OBJECTA_H_
#define OBJECTA_H_

#include "ObjectB.h"

#include <iostream>
using namespace std;

class ObjectA {
private:
    friend void friendFunction(ObjectA &,ObjectB &);

public:
    ObjectA();
    virtual ~ObjectA();
};

#endif /* OBJECTA_H_ */

ObjectB.h:

#ifndef OBJECTB_H_
#define OBJECTB_H_

#include <iostream>
using namespace std;

#include "ObjectA.h"

class ObjectB {
private:
    friend void friendFunction(ObjectA &, ObjectB &);

public:
    ObjectB();
    virtual ~ObjectB();
};

#endif /* OBJECTB_H_ */

ObjectA と ObjectB の両方の .cpp ファイルが空です (空のコンストラクターとデストラクター)。メインの .cpp ファイルは次のとおりです。

#include <iostream>
using namespace std;

#include "ObjectA.h"
#include "ObjectB.h"

void friendFunction(ObjectA &objA, ObjectB &objB){
    cout << "HIIIIIIIIIII";
}

int main() {
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!

    return 0;
}

これにより、次のエラーが表示されます。

'ObjectA' has not been declared

そして、このエラーは ObjectB.h の次の行を指しています:

friend void friendFunction(ObjectA &, ObjectB &);

ご覧のとおり、ObjectA.h ファイルは ObjectB.h ファイルに含まれています。だから私は私のエラーがどこから来たのか分かりません。

多分私は間違った方法で友人機能を使用していますか?

君たちありがとう !

4

2 に答える 2

3

ObjectA.h で、以下を置き換えます。

#include "ObjectB.h"

と:

class ObjectB;

ObjectB.h で対応する変更を行います。

何が起こっているかというと、main.cpp に ObjectA.h が含まれているということです。クラスを宣言する前にObjectA、ObjectA.h は ObjectB.h をインクルードします。ObjectB.h が ObjectA.hを再度インクルードしようとすると、#ifndef OBJECTA_H_テストは失敗します。つまりObjectA、フレンド関数が宣言されているときにクラスが宣言されていないため、エラーが発生します。

の代わりに前方クラス宣言を使用して、特定のケースでこのループを中断できます#include

于 2014-11-02T16:48:11.743 に答える
0

代わりにテンプレート機能を使用していますか?しかし、この方法ではカプセル化を破ります。

class A{
private:
  template<typename T, typename B>
  friend void friendFunc( const T&, const B&);
  int m_a;
};

template<typename A, typename B>
void friendFunc( const A& a, const B& b){
  std::cout << a.m_a << std::endl;
}

int main(int argc, char **argv) {    
    friendFunc<A, int>(A(), int(3));
    return 0;
}
于 2014-11-02T17:04:15.047 に答える