我想在一个对象中初始化一个成员(引用类型)以指向另一个对象(不同类型)的私有成员。我使用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 ++来理解为什么上述做法被认为是有问题或者有问题。
我正在研究硬件模拟环境中的研究项目,其中testbench是用C ++编写的。该项目的目的是将类(私有)成员显示为波形。唯一可靠的方法是将“波形制造者”类作为测试平台对象的friend
,然后让它“跟踪”私有成员(通过创建reference
如上所述) 。在测试平台中提供getter方法的另一种方法是不切实际的,因为这个项目将使用20年的遗留代码。
答案 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>