C++静态朋友方法示例(需要澄清)

C++ Static Friend Method Example (Need Clarification)

本文关键字:静态 朋友 方法 C++      更新时间:2023-10-16

这是一个C++如何工作的问题。

我一直在研究friend修饰符,并在这里找到了一个static friend方法的示例。

但现在我很难理解为什么要做某些事情来让它发挥作用。

我也很好奇这可以用于什么实用应用程序?您希望何时使用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;
}

让我们先看看代码:

A类//1.为什么在这里声明类A并在下面定义它?

这是一个前瞻性声明。B有一个类型为A*的成员,因此必须事先声明A

A*B::pa//2.为什么需要这样做?

静态数据成员仅在类定义内部声明。这就是定义,标准要求它出现在一个翻译单元中。

B B//3.这有必要吗?C++不会自动启动静态吗//引用类时的成员变量

没有必要。当然,除非B中的static方法依赖于构造函数的运行。如果他们真的这样做了,那就是一个糟糕的设计。

关于friend问题。通常,有朋友会破坏封装,无论他们是成员还是整个类。这也没什么不同。它只是告诉编译器A::iPrivate可以从B::SetAiPrivate直接访问。

这在我看来是错误的,因为您可能希望能够直接从A而不是从B设置A的成员。

1为什么在这里声明类A并在下面定义它?

如果A是在类B之后定义的,则需要转发声明A,因为类B包含指向A实例的指针。如果您在类B之前定义了类A,则不需要

2为什么需要这样做?

静态成员必须在类定义之外的某个地方初始化

3这有必要吗?当类被引用时,C++不会自动启动静态成员变量吗

AFAIK知道这是不需要的,因为你提到