0

クラスで遊ぶためだけに、小さなプログラムをやっています。そして、a と b の 2 つのクラスを作成しました。

a の b に、またはその逆にアクセスできるようにしたい。これは私がこれまでに得たものです:

#ifndef A_HH_
#define A_HH_

#include <string>

class b;

class a
{
private:
    string aString;
    b* bClass;
public:
    a(){aString = "A";}
    string getString(){return aString;}
    string getBString(){return bClass->bString;}
};


#endif /* A_HH_ */

および b:

#ifndef B_HH_
#define B_HH_

#include <string>

class a;

class b
{
private:
    string bString;
    a* aClass;
public:
    b(){bString = "B";}
    string getString(){return bString;}
};


#endif /* B_HH_ */

ポインターを保存するだけでなく、ポインターにアクセスできるようにしたい。どうやってやるの?

4

3 に答える 3

1

問題は、 class でポインタを使用することです。そのためには、 class の定義が必要です。この場合、これは単純に in に含めることで解決できます。この単純なソリューションは、 class でポインターを宣言するだけで機能します (ただし、アクセスしないでください) 。前方宣言は、実際にはクラスが存在すること以上のことをコンパイラーに伝えないため、十分ではありません。bClassabb.hha.hhabb

ああ、プライベートと同様に、 bClass->bStringina::getBStringをに変更する必要があります。もちろん、 の実際のインスタンスを作成し、それを に割り当てます。bClass->getString()b::bStringbbClass

于 2013-10-29T12:28:29.340 に答える
0

In short, to access members of a struct or a class, you need to meet two conditions:

  1. the accessing element (class, method, ...) must have access "rights" to the referenced member
  2. the definition of the struct/class must be available.

To overcome 1. you can either make the member public, or declare the accessing class or method as friend, or better use a getter method. To overcome 2., you need to include the header of the referenced class.

于 2013-10-29T12:36:37.957 に答える
0

テンプレートを使用できます。

のために:

#ifndef A_HH_
#define A_HH_

#include <string>
#include "b.h"


class a
{
private:
    string aString;
    b* bClass;
public:
    a()
    {
        aString = "A";
        bClass = new b<a>;
    }
    string getString(){return aString;}
    string getBString(){return bClass->getString();}
};


#endif /* A_HH_ */

および b の場合:

#ifndef B_HH_
#define B_HH_

#include <string>

template <typename T>
class b
{
private:
    string bString;
    T* aClass;
public:
    b()
    {
        bString = "B";
        aClass = new T;
    }
    string getString(){return bString;}
    string getAString(){return aClass->getString();}
};


#endif /* B_HH_ */

これにより、循環依存関係が削除されます

于 2013-10-29T13:39:07.230 に答える