因此,我最近刚刚了解了C ++中的friend
和this
,当时我正在观看面向C ++和编程初学者的教程。我对this
语法或其他语法感兴趣,他说这是一个指针,并存储对象的地址,因此我进行了实验。
有可能使用来自不同类函数的不同类对象吗?如果可以,怎么办?
无论如何这里是代码
||
\/
#include <iostream>
class A
{
public:
void Aprint()
{
std::cout << "It is A " << this->Number << std::endl;
}
private:
int Number = 1;
};
class B
{
public:
void Bprint()
{
std::cout << "It is B " << std::endl;
}
private:
int Number = 0;
friend void A::Aprint();
};
int main()
{
A Abo;
B Bbo;
Abo.Aprint();
}
当我使用B类对象时,我希望它打印0
。
在调用或编译时,在0
之后显示show "It is A"
。原因我想看看使用Bbo.Aprint()
时会发生什么。我想知道this
和friend
的工作方式。还在尝试。
Before it was `Bbo.Aprint()` just edited.
答案 0 :(得分:2)
我认为您正在尝试模仿带有朋友声明的继承。据我了解,朋友声明允许您从朋友类或函数访问A类的私有成员。如果您希望B类能够调用A类函数,我认为您应该使用继承和虚函数。
也许这对您有帮助。
答案 1 :(得分:1)
您不能使用另一个类的实例调用一个类的成员函数(除非这些类通过继承关系关联):
Abo.Aprint(); // OK
Bbo.Aprint(); // Not OK
答案 2 :(得分:1)
有一种方法可以做到这一点。为此,您必须将A::Aprint
的签名更改为void Aprint(const B&);
#include <iostream>
class B; // forward declaration
class A
{
public:
void Aprint(const B&);
private:
int Number = 1;
};
class B
{
public:
void Bprint()
{
std::cout << "It is B " << std::endl;
}
private:
int Number = 0;
friend void A::Aprint(const B&);
};
void A::Aprint(const B& b) {
std::cout << "It is A " << b.Number << std::endl;
}
int main()
{
A Abo;
B Bbo;
Abo.Aprint(Bbo);
}
在此示例中,因为A::Aprint()
是B的朋友,所以Aprint()
甚至可以访问Bbo的私有成员(即使是私有的,请参见b.Number
也可以)