将朋友的引用成员初始化为类私有成员

时间:2013-01-03 11:55:05

标签: c++ reference friend c++03

我想在一个对象中初始化一个成员(引用类型)以指向另一个对象(不同类型)的私有成员。我使用friend来提供对私有成员的访问权限。 (请跟我说一下,我会进一步解释为什么我需要这样做。)

以下是我尝试开始使用的代码的最低版本,但它显然不起作用。现在显然,我只是尝试使用此代码Aries a(t.Leo);初始化引用,但因为这是在main()内完成的,所以它不会编译。

我在这里和互联网上发了很多帖子(关于friendreference的主题),但无法找到解决问题的方法。我怎样才能使这项工作,或者我可以尝试正确绑定参考的其他方法?

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 ++来理解为什么上述做法被认为是有问题或者有问题。

我正在研究硬件模拟环境中的研究项目,其中testbench是用C ++编写的。该项目的目的是将类(私有)成员显示为波形。唯一可靠的方法是将“波形制造者”类作为测试平台对象的friend,然后让它“跟踪”私有成员(通过创建reference如上所述) 。在测试平台中提供getter方法的另一种方法是不切实际的,因为这个项目将使用20年的遗留代码。

3 个答案:

答案 0 :(得分:2)

只需更改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);
}

答案 1 :(得分: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的内部表示。

答案 2 :(得分:0)

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

因此,在你的情况下,如果白羊座是金牛座的朋友,你会期望两者之间存在强烈的耦合。

您的代码无法正常工作,因为您从主要访问Taurus.Leo,而不是从Aries访问。

友谊的目的尤其不是为了创造一个公众" getter"对于这些变量。那是因为这些变量是"内部细节"你不希望广大公众访问,甚至不想阅读。

因此,虽然我希望上面的大部分答案都是可能的解决方案,并且会编译和工作,但您必须了解友情和设计的概念,以确定它是否适合使用。< / p>