C++静态朋友方法示例(需要澄清)
C++ Static Friend Method Example (Need Clarification)
这是一个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知道这是不需要的,因为你提到
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- C++从另一个类访问公共静态向量的正确方法是什么
- 基于boost的程序的静态链接——zlib问题
- 在静态库中嵌入类方法
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何在C++中获得"静态纯虚拟"功能?
- 私有类型的静态常量成员
- 使用gcc从静态链接的文件中查找可选符号
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 如何在C++中使用非静态成员函数作为回调函数
- 将静态库链接到不带-fPIC的共享库中
- 静态结构和一个定义规则
- 在这种情况下,我们可以使用静态而不是朋友吗,还有其他解决方案是什么
- 如何从C 的朋友类访问私有静态方法
- C++静态朋友方法示例(需要澄清)