这是C ++如何运作的问题。
我一直在研究friend
修饰符并找到了static friend
方法的示例here.
但是现在我无法理解为什么已经完成某些事情以使其发挥作用。
我也很好奇 实用 应用程序可以用于什么?您何时想要才能使用static friend
?这应该避免吗?
这是添加注释的代码,指出我很困惑的部分。
#include <iostream>
class A; //1. why declare class A here and define it below?
class B
{
public:
B();
~B();
static void SetAiPrivate(int value); //Makes SetAiPrivate static
static A *pa; //static instance of class A for class B's static
//methods to use
};
class A
{
friend void B::SetAiPrivate(int); //Gives Class B's SetAiPrivate method access
//to A's private variables
public:
A(){iPrivate = 0;}
~A(){}
void PrintData(){ std::cout << "iPrivate = "<< iPrivate<<"\n";}
private:
int iPrivate;
};
A *B::pa;//2. Why is this needed?
// If commented out it causes an external linking error.
B::B()
{
pa = new A;
}
B::~B()
{
delete pa;
}
void B::SetAiPrivate(int value)
{
pa->iPrivate = value;
}
int main()
{
B b; //3. Is this necessary? Doesn't C++ automatically initiate static
// member variables when a class is referenced
B::SetAiPrivate(7);
B::pa->PrintData();
return 0;
}
答案 0 :(得分:1)
让我们先看一下代码:
A级; // 1。为什么在这里声明A类并在下面定义它?
这是一份前瞻性声明。 B
的成员类型为A*
,因此必须事先声明A
。
A * B :: pa; // 2。为什么需要这个?
静态数据成员仅在类定义中声明。这就是定义,标准要求它出现在单个翻译单元中。
B b; // 3。这有必要吗?不是C ++自动启动静态 //引用类时的成员变量
没必要。当然,除非static
中的B
方法依赖于构造函数的运行。如果他们这样做,这是一个糟糕的设计。
在friend
问题上。通常,让朋友打破封装,无论是成员还是整个班级。这没什么不同。它只是告诉编译器可以从A::iPrivate
直接访问B::SetAiPrivate
。
这对我来说是错误的,因为您可能希望能够直接从A
设置A
的成员,而不是B
。
答案 1 :(得分:1)
1为什么在这里声明A类并在下面定义它?
如果在B类之后定义,则需要转发声明A,因为B类包含指向A实例的指针。如果您在B类之前定义了A类,则不需要它
2为什么需要这个?
必须在类定义之外的某处初始化静态成员
3这有必要吗?在引用类时,C ++不会自动启动静态成员变量
AFAIK知道您提及
的原因不需要这样做