无法在友元函数中实例化类?我没有在范围错误中声明

时间:2017-02-24 14:30:03

标签: c++ friend

我无法在友元函数中实例化测试类,编译器抛出错误ptr未在此范围内声明。我相信朋友的功能可以访问该类的所有私人和公共成员但我收到此错误。我无法弄清楚我哪里出错了?

#include<iostream>
using namespace std;

class test;
test* friendOfTest();

class test{
private: 
    static test* ptr;
public:
    friend test* friendOfTest();
    void someMethod(){ cout<<"someMethod()\n";}
};

test* test::ptr=NULL;

test* friendofTest(){
    ptr = new test; //Error,ptr not declared in this scope in this line
    return ptr;
}


int main(){
    test* t;
    t = friendofTest();
    t->someMethod();
    return 0;
}

2 个答案:

答案 0 :(得分:1)

是的,您可以访问ptr,但语法是错误的:

test* friendofTest(){
    test::ptr = new test; // note test::
    return test::ptr;
}

朋友的功能不会成为您班级的会员功能,它只是允许其成员被访问,即使被宣布为私人或受保护。

在这种情况下,

friendofTest仍然是您班级中完全单独的功能,但您可以通过访问其静态test成员范围解析运算符像往常一样,即使它被声明为私有。

答案 1 :(得分:0)

有两种方法可以使程序编译。

第一个作为友元函数在类外定义的是使用静态类数据成员的限定名。例如

test* friendOfTest(){
    test::ptr = new test; //Error,ptr not declared in this scope in this line
    return test::ptr;
}

第二个是定义类中的函数。在这种情况下,它将属于该类的范围。

根据C ++标准(11.3朋友)

  

7这样的功能是隐式内联的。一个朋友的功能定义在一个   class位于定义它的类的(词法)范围内。一个   在课堂外定义的朋友功能不是(3.4.1)。

例如

class test{
private: 
    static test* ptr;
public:
    friend test* friendOfTest();

friend test* friendOfTest(){
    ptr = new test; //Error,ptr not declared in this scope in this line
    return ptr;
}

    void someMethod(){ cout<<"someMethod()\n";}
};

这是演示程序

#include<iostream>
using namespace std;

class test;
test* friendOfTest();

class test{
private: 
    static test* ptr;
public:
    friend test* friendOfTest();
/*
friend test* friendOfTest(){
    ptr = new test; //Error,ptr not declared in this scope in this line
    return ptr;
}
*/
    void someMethod(){ cout<<"someMethod()\n";}
};

test* test::ptr=NULL;

test* friendOfTest(){
    test::ptr = new test; //Error,ptr not declared in this scope in this line
    return test::ptr;
}


test* friendofTest();

int main(){
    test* t;
    t = friendOfTest();
    t->someMethod();
    return 0;
}

#include<iostream>
using namespace std;

class test;
test* friendOfTest();

class test{
private: 
    static test* ptr;
public:
//    friend test* friendOfTest();

friend test* friendOfTest(){
    ptr = new test; //Error,ptr not declared in this scope in this line
    return ptr;
}

    void someMethod(){ cout<<"someMethod()\n";}
};

test* test::ptr=NULL;
/*
test* friendOfTest(){
    test::ptr = new test; //Error,ptr not declared in this scope in this line
    return test::ptr;
}
*/

test* friendofTest();

int main(){
    test* t;
    t = friendOfTest();
    t->someMethod();
    return 0;
}

这两个程序编译成功。