gpt4 book ai didi

C++ 静态友元方法示例(需要说明)

转载 作者:行者123 更新时间:2023-11-30 04:25:21 25 4
gpt4 key购买 nike

这是一道 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;
}

最佳答案

我们先看代码:

class A; //1. why declare class A here and define it below?

这是一个前向声明。 B 有一个A* 类型的成员,所以A 必须事先声明。

A *B::pa;//2. Why is this needed?

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

B b; //3. Is this necessary? Doesn't C++ automatically initiate static // member variables when a class is referenced

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

关于 friend 问题。通常,有 friend 会打破封装,无论他们只是成员还是整个类(class)。这也不异常(exception)。它只是告诉编译器 A::iPrivate 可以直接从 B::SetAiPrivate 访问。

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

关于C++ 静态友元方法示例(需要说明),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12206035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com