[英]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.