0

あるオブジェクトの(参照型の)メンバーを初期化して、(別の型の)別のオブジェクトのプライベートメンバーを指すようにしたい。私friendはプライベートメンバーへのアクセスを提供するために使用します。(少しお待ちください。なぜこれを行う必要があるのか​​をさらに詳しく説明します。)

以下は、私が始めようとしたコードの最低限のバージョンですが、明らかに機能しません。明らかに、私はこのコードAries a(t.Leo);で参照を初期化しようとしているだけですが、これは内部main()で行われるため、コンパイルされません。

friend私はこことインターネット上で(とのトピックについてreference)多くの投稿を調べましたが、それを解決する方法を見つけることができませんでした。どうすればこれを機能させることができますか、または参照を正しくバインドするために他にどのようなアプローチを試みることができますか?

class Aries;

class Taurus {
friend class Aries;
public:
  void setLeo(int inLeo) {
    Leo = inLeo;
  }

private:
  int Leo;
};

class Aries {
public:
  Aries(const int& inCancer) : Cancer(inCancer) {}

private:
  const int& Cancer;
};

int main() {
  Taurus t;
  Aries a(t.Leo);  // Intention: initialize (bind) the Cancer member with t's Leo.
}

上記のプラクティスが疑わしいまたは悪いと見なされる理由を理解するのに十分なC++を知っていることに注意してください。

私は、テストベンチがC++で記述されているハードウェアシミュレーション環境での研究プロジェクトに取り組んでいます。プロジェクトの目的は、クラス(プライベート)メンバーを波形として表示することです。これを行う唯一の信頼できる方法は、「波形メーカー」クラスをfriendテストベンチオブジェクトの1つとして作成し、それをプライベートメンバーに「ストーキング」させることです(reference上記のように作成することにより)。このプロジェクトは20年分のレガシーコードで使用されるため、テストベンチでゲッターメソッドを提供する他の方法は実用的ではありません。

4

3 に答える 3

2

プライベートではなく、Ariesコンストラクターを変更して参照を取得するだけです。そのようです:Taurusint

class Aries;

class Taurus {
friend class Aries;
public:
  void setLeo(int inLeo) {
    leo = inLeo;
  }

private:
  int leo;
};

class Aries {
public:
  Aries(const Taurus& inTau) : Cancer(inTau.leo) {}

private:
  const int& Cancer;
};

int main() {
  Taurus t;
  Aries a(t);
}
于 2013-01-03T12:01:37.550 に答える
1

それfriendは疑わしいですが、時には必要なこともありますが、この場合、これらのクラスは友達である必要はありません。

struct AriesBinder {
  AriesBinder(const int& c) : Cancer(c) {}
  const int& Cancer;
};

class Taurus {
public:
  void setLeo(int inLeo) {
    Leo = inLeo;
  }

  AriesBinder bind() const { return AriesBinder(Leo); }

private:
  int Leo;
};

class Aries {
public:
  Aries(const int& inCancer) : Cancer(inCancer) {}
  Aries(AriesBinder b) : Cancer(b.Cancer) {}

private:
  const int& Cancer;
};

int main() {
  Taurus t;
  Aries b(t.bind());  // Intention was made clear
}

Taurusこれは、のような多くのオブジェクトをにバインドできる場合に特に便利ですAries。また、これで両方のクラスが分離されるため、お互いを知る必要がなくなるため、の内部表現を変更できますTaurus

于 2013-01-03T12:10:49.573 に答える
0

友情の目的は、あなたのクラスと緊密に結合されている特定のクラス、多くの場合、クラスファクトリ(クラスを構築するときにメンバーを割り当てる)またはいくつかの特別な実装クラスへのアクセスを許可することです。

したがって、あなたの場合、牡羊座がおうし座の友人である場合、2つの間に強い結合があると予想されます。

Ariesからではなく、mainからTaurus.Leoにアクセスしているため、コードは機能しません。

友情の目的は、特にこれらの変数の公開「ゲッター」を作成する必要がないことです。これは、これらの変数が「内部の詳細」であり、一般の人々がアクセスしたり、読んだりすることさえ望まないためです。

したがって、上記の回答のほとんどが可能な解決策であり、コンパイルして機能することを期待していますが、特定のケースの友情と設計の概念を理解して、それが適切な使用法であるかどうかを確認する必要があります。

于 2013-01-03T12:24:59.110 に答える