我正在编写代码以通过另一个朋友类访问类的私有成员。以下代码可以使用
// Example program
#include <iostream>
#include <string>
using namespace std;
class Foo
{
private:
int a;
protected:
public:
friend class Bar;
Foo(int x)
{
a = x ;
}
};
class Bar
{
private:
protected:
public:
int b;
Bar(Foo& f)
{
b = f.a;
cout << "f.a is " << f.a << endl;
}
};
int main()
{
Foo foo(5);
Bar bar(foo);
cout << "Value of variable b is " << bar.b << endl;
}
以上代码工作正常。但是,如果我想通过朋友类Foo
中的函数访问Bar
的私有变量,我无法做到。见下面的代码
#include <iostream>
#include <string>
using namespace std;
class Foo
{
private:
int a;
protected:
public:
friend class Bar;
Foo(int x)
{
a = x ;
}
};
class Bar
{
private:
protected:
public:
int b;
Bar(Foo& f)
{
b = f.a;
}
void printvariable(void)
{
cout << "f.a is " << f.a << endl;
}
};
int main()
{
Foo foo(5);
Bar bar(foo);
cout << "Value of variable b is " << bar.b << endl;
}
我完全理解为什么执行失败
void printvariable(void)
{
cout << "f.a is " << f.a << endl;
}
函数,因为f不在函数范围内。但是,由于我在Foo f
的构造函数中传递Bar b
,我希望编写的代码允许我访问Foo
中的成员而不将Foo f
传递给函数再次printvariable()
。
编写此代码的最有效方法是什么?
答案 0 :(得分:0)
您可以保留对f
的引用。代码应该是:
class Bar
{
private:
protected:
public:
int b;
Foo& f_ref;
Bar(Foo& f)
:f_ref(f)
{
b = f.a;
}
void printvariable(void)
{
cout << "f.a is " << f_ref.a << endl;
}
};
答案 1 :(得分:0)
你可以这样做,但如果我是你,我会写一些吸气剂,也不是真正推荐的阶级友谊。
<img src="<?php echo base_url('uploads'); ?>/'+ status_image +'">
顺便说一下,没有理由在C ++的括号中添加class Bar {
public:
Foo& ref;
Bar(Foo& f)
: ref { f }
{ }
void printvariable() {
cout << "f.a is " << ref.a << endl;
}
};
,它从C中失去了意义,现在没有效果。
答案 2 :(得分:0)
你错了一点。您确实在ctor中传递了对f
的引用,但构造函数和整个class Bar
不记得 {{1>的整个对象}}。在原始代码中,构造函数只使Bar对象记住对象的f
部分,因此稍后只能访问该对象:
int a
请注意您的律师只会阅读class Foo
{
...
friend class Bar;
...
};
class Bar
{
...
int b;
Bar(Foo& f)
{
b = f.a; // <=--- HERE
}
void printvariable(void)
{
cout << "f.a is " << b << endl; // <-- now it refers B
}
并将其存储在f.a
中。从现在开始,Bar对象只记得b
,而这就是全部。您可以b
自由访问b
。但是,它不会是printvariable
- 取自 - a
。它将是f
,在构造函数中设置为与f.a相同的值。从那时起,b
和b
完全分开。这就是复制价值的方式。
要让Bar记住整个 f.a
,您必须记住整个 f:
f
然而,还有一个问题:现在class Bar
{
...
Foo wholeThing;
Bar(Foo& f)
{
wholeThing = f; // <=--- HERE
}
void printvariable(void)
{
cout << "f.a is " << wholeThing.a << endl;
}
的类型为wholeThing
,构造函数实际上会在Foo
期间复制该对象。与wholeThing=f
时的情况相同,但现在它还记得整个f的副本。
当然,这只是类型问题。您可以存储引用而不是整个Foo,但它需要一些不同的初始化语法:
b=f.a