使用友元函数的奇怪行为 - 当对象指针通过时范围“全局化”?

时间:2011-04-13 02:37:11

标签: c++ function scope friend

假设我有一个头文件a.h和一个源文件a.cpp。当我尝试编译它并从包含a.h的不同文件(例如main.cpp)调用what()时:


A.H:

class A {  
friend void what();  
public:  
    int index;  
};

a.cpp:

#include "a.h"
#include <iostream>

void what() {  
    std::cout << "what" << std::endl;  
}

失败,正如所料(错误:'什么'未在此范围内声明)。但是,当我对此做同样的事情时:


A.H:

class A {  
friend void what(A *thing);  
public:  
    int index;  
};

a.cpp:

#include "a.h"
#include <iostream>

void what(A *thing) {  
    std::cout << thing->index << std::endl;  
}

它在g ++ 4.4.1上编译并运行得很好(假设“索引”已经初始化了)。我对C ++知之甚少,但我认为,通过将对象指针传递给函数,函数以某种方式可用于全局范围(即获得“提升”以便能够“看到”对象以前存在于与它相同的范围内)。我还没有尝试过其他类型的函数,但是,当使用g ++和friend函数时,我得到了这种行为。这应该发生在C ++中吗?

谢谢,对不起,如果这是一个讽刺的问题,我的朋友谷歌让我失望了。

2 个答案:

答案 0 :(得分:0)

我认为你在课堂宣言结束时忘记了;

以下代码对我来说非常合适(gcc 4.4.5)

A.H

class A {
friend void what();
private:
    int index;
};

a.cpp

#include <iostream>
#include "a.h"

using namespace std;

void what()
{
    cout << "what" << endl;
}

int main()
{
        what();
        return 0;
}

<强>更新

您应该在what类声明之前在a.h头文件中声明A函数。

答案 1 :(得分:0)

我用g ++ 4.5.1编译了你的代码,没有报告错误。