0

我想在一个对象中初始化一个成员(引用类型)以指向另一个对象(不同类型)的私有成员。我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++ 来理解为什么上述做法被认为是有问题的或不好的。

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

4

3 回答 3

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

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

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

您的代码不起作用,因为您是从 main 访问 Taurus.Leo,而不是从 Aries。

建立友谊的目的尤其是不必为这些变量创建公共“吸气剂”。那是因为这些变量是“内部细节”,您不希望广大公众访问,甚至不阅读。

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

于 2013-01-03T12:24:59.110 回答