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

时间:2012-08-30 21:47:47

标签: c++ implementation static-methods friend

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

2 个答案:

答案 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知道您提及

的原因不需要这样做