【问题标题】:Not able to Instantiate class inside friend function? I am getting not declared in scope error无法在友元函数中实例化类?我没有在范围错误中声明
【发布时间】:2017-02-24 14:30:02
【问题描述】:

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

#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;
}

【问题讨论】:

  • test::ptr = new test;
  • test::ptr = new test;
  • 晚了 8 秒 >_
  • return test::ptr;
  • @YSC 我同意,投票没用

标签: c++ friend


【解决方案1】:

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

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

友元函数对于您的类不会充当成员函数,它只允许访问其成员,即使声明为私有或受保护。

在这种情况下,

friendofTest 仍然是与您的类完全独立 的函数,但您可以通过 作用域解析运算符 访问它的静态 test 成员通常,即使它被声明为私有。

【讨论】:

  • 我尝试像你说的那样使用范围解析来访问 ptr,但我仍然收到这个奇怪的错误。在函数‘test*friendofTest()’中出错:‘test*test::ptr’是私有的test*test::ptr=NULL; ^ 错误:在此上下文中 test::ptr = new test;
  • @SadikKhan 检查this 问题。
【解决方案2】:

编译程序有两种可能。

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

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

第二个是在类内部定义函数。在这种情况下,它将在类的范围内。

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

7 这样的函数是隐式内联的。定义在 a 中的友元函数 类在定义它的类的(词法)范围内。一种 类外定义的友元函数不是 (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;
}

两个程序都编译成功。

【讨论】:

  • 我尝试了这两种方法,但我仍然得到 ptr 没有在这个范围内声明。
  • @Sadik Khan 查看我更新的帖子,其中显示了两个成功编译的演示程序。
  • @Sadik Khan 你忘了在第二种方法中使用限定名 return test::ptr;
  • 我已经尝试在上述两种方法中完全编译,但似乎仍然无法正常工作
  • @SadikKhan 复制并粘贴代码并在 www.ideone.com 尝试,您将看到代码编译。
猜你喜欢
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
相关资源
最近更新 更多