如何授予朋友 class 访问修改成员的值
How to grant friend class access to value of modified member
授予 class 访问不同 class 的私有成员的修改值的正确方法是什么。
使用朋友 Class 允许我访问私有成员的值(如果提供)但不允许我访问该成员的修改后的值数据。
例如,当我在一个 Class 中构建向量时,我想在另一个 class.
中构建该向量的数据
如何为
授予访问权限
bar_start.Print()
与
具有相同的值
foo_start.PrintData()
我相信它还在记忆中,并没有被删除
class Foo
{
public:
Foo();
~Foo();
void ChangeData();
void PrintData();
private:
int k = 0;
std::vector<int> m_vector;
friend class Bar;
};
class Bar
{
public:
Bar();
~Bar();
void Print();
};
void Foo::ChangeData()
{
m_vector.push_back(1);
int k = 5;
}
void Foo::PrintData()
{
std::cout << k << std::endl;
std::cout << m_vector[0] << std::endl;
}
void Bar::Print()
{
Foo obj;
std::cout << obj.k << std::endl;
std::cout << obj.m_vector[0] << std::endl;
}
// printing in main() function
Foo foo_start;
Bar bar_start;
foo_start.ChangeData();
foo_start.PrintData(); // k = 5, m_vector[0] = 1;
bar_start.Print(); // k = 0, m_vector[0] empty and error due not existing element in vector
你的意思好像是下面这样
void Bar::Print( Foo &obj )
{
std::cout << obj.k << std::endl;
std::cout << obj.m_vector[0] << std::endl;
}
并像
一样调用方法
bar_start.Print( foo_start );
或者只是
void Bar::Print( Foo &obj )
{
obj.PrintData()
}
并像
一样调用方法
bar_start.Print( foo_start );
那就是你需要通过引用传递给成员函数打印一个Foo类型的对象。
要使用最后显示的函数定义,不需要将 class Bar 声明为 class Foo 的友元,因为成员函数 PrintData
是 public 成员函数.
您可能希望在每个 Bar
实例中存储指向特定 Foo
的引用/指针。
class Bar {
public:
Bar(Foo& f) : foo(&f) {} // take a Foo by reference and store a pointer to it
void Print();
private:
Foo* foo;
};
void Bar::Print() { // use the pointer to the Foo in here:
std::cout << foo->k << std::endl;
std::cout << foo->m_vector[0] << std::endl;
}
然后您需要创建每个 Bar
来提供您希望它连接到的 Foo
实例:
int main() {
Foo foo_start;
Bar bar_start(foo_start); // this Bar now stores a pointer to foo_start
foo_start.ChangeData();
bar_start.Print();
}
还要注意,你在ChangeData
里面实例化的k
不是成员变量k
。您用 5
初始化了一个名为 k
的新变量,然后忘记了 k
。
void Foo::ChangeData()
{
m_vector.push_back(1);
int k = 5;
}
如果要对成员变量k
进行修改,去掉声明部分,直接赋值5
即可:
void Foo::ChangeData()
{
m_vector.push_back(1);
k = 5;
}
授予 class 访问不同 class 的私有成员的修改值的正确方法是什么。
使用朋友 Class 允许我访问私有成员的值(如果提供)但不允许我访问该成员的修改后的值数据。
例如,当我在一个 Class 中构建向量时,我想在另一个 class.
中构建该向量的数据如何为
授予访问权限bar_start.Print()
与
具有相同的值foo_start.PrintData()
我相信它还在记忆中,并没有被删除
class Foo
{
public:
Foo();
~Foo();
void ChangeData();
void PrintData();
private:
int k = 0;
std::vector<int> m_vector;
friend class Bar;
};
class Bar
{
public:
Bar();
~Bar();
void Print();
};
void Foo::ChangeData()
{
m_vector.push_back(1);
int k = 5;
}
void Foo::PrintData()
{
std::cout << k << std::endl;
std::cout << m_vector[0] << std::endl;
}
void Bar::Print()
{
Foo obj;
std::cout << obj.k << std::endl;
std::cout << obj.m_vector[0] << std::endl;
}
// printing in main() function
Foo foo_start;
Bar bar_start;
foo_start.ChangeData();
foo_start.PrintData(); // k = 5, m_vector[0] = 1;
bar_start.Print(); // k = 0, m_vector[0] empty and error due not existing element in vector
你的意思好像是下面这样
void Bar::Print( Foo &obj )
{
std::cout << obj.k << std::endl;
std::cout << obj.m_vector[0] << std::endl;
}
并像
一样调用方法bar_start.Print( foo_start );
或者只是
void Bar::Print( Foo &obj )
{
obj.PrintData()
}
并像
一样调用方法bar_start.Print( foo_start );
那就是你需要通过引用传递给成员函数打印一个Foo类型的对象。
要使用最后显示的函数定义,不需要将 class Bar 声明为 class Foo 的友元,因为成员函数 PrintData
是 public 成员函数.
您可能希望在每个 Bar
实例中存储指向特定 Foo
的引用/指针。
class Bar {
public:
Bar(Foo& f) : foo(&f) {} // take a Foo by reference and store a pointer to it
void Print();
private:
Foo* foo;
};
void Bar::Print() { // use the pointer to the Foo in here:
std::cout << foo->k << std::endl;
std::cout << foo->m_vector[0] << std::endl;
}
然后您需要创建每个 Bar
来提供您希望它连接到的 Foo
实例:
int main() {
Foo foo_start;
Bar bar_start(foo_start); // this Bar now stores a pointer to foo_start
foo_start.ChangeData();
bar_start.Print();
}
还要注意,你在ChangeData
里面实例化的k
不是成员变量k
。您用 5
初始化了一个名为 k
的新变量,然后忘记了 k
。
void Foo::ChangeData()
{
m_vector.push_back(1);
int k = 5;
}
如果要对成员变量k
进行修改,去掉声明部分,直接赋值5
即可:
void Foo::ChangeData()
{
m_vector.push_back(1);
k = 5;
}