繁体   English   中英

将朋友的推荐成员初始化为班级私人成员

[英]Initializing a friend's reference member to a class private member

我想初始化一个对象中的成员(引用类型)以指向另一个对象(不同类型)的私有成员。 我使用friend提供对私人成员的访问。 (请耐心等待,我进一步解释了为什么需要这样做。)

下面是我尝试入门的最低代码版本,它显然不起作用。 现在清楚了,我只想用此代码Aries a(t.Leo);初始化引用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 ++编写的。 该项目的目的是将班级(私人)成员显示为波形。 唯一可靠的方法是使“ waveform maker”类成为Testbench对象的friend ,然后使其“跟踪”私有成员(通过创建上述reference )。 在测试平台中提供吸气剂方法的另一种选择是不切实际的,因为该项目将使用20年的旧代码。

只需将Aries构造函数更改为采用Taurus引用,而不是直接使用私有int即可。 像这样:

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);
}

我知道您知道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的内部表示形式。

友谊的目的是允许访问与您紧密相关的某些类,通常是类工厂(在构造类时分配成员)或某些特殊的实现类。

因此,在您的情况下,如果白羊座是金牛座的朋友,您会期望两者之间有很强的联系。

您的代码无效,因为您是从main而不是Aries访问Taurus.Leo。

友谊的目的尤其是不必为这些变量创建一个公共“获取器”。 这是因为这些变量是“内部细节”,您不希望广大公众访问甚至阅读。

因此,尽管我希望上面的大多数答案都是可行的解决方案,并且可以编译和工作,但您必须了解特定案例的友谊和设计概念,以查看它是否合适。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM