gpt4 book ai didi

c++ - 在声明与实现中访问方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:20 25 4
gpt4 key购买 nike

我在解释我的一些结果时遇到了困难,我希望它们的行为相同,但事实并非如此。

我正在尝试编写一个返回函数指针的方法getPtrFn

我有一个ma​​in.c文件读取

#include <iostream>
#include "test.hpp"

int main(int argc, char* argv[]){

Test test;

void (*fPtr)(void) = test.getPtrFn();
return 0;
}

读取的test.hpp文件

#ifndef _test_h
#define _test_h

class Test {
private:
void (*ptrFn)(void);

public:
Test(){};
void (*getPtrFn(void))(void){
return ptrFn;
};

~Test();

};

#endif

还有一个test.cpp文件

#include "test.hpp"
Test::~Test(){}

这运行良好。但是,当我将 *getPtrFn(void) 的实现移动到实现文件(如下所示的修订文件)时,

测试.hpp:

#ifndef _test_h
#define _test_h

class Test {
private:
void (*ptrFn)(void);

public:
Test(){};
void (*getPtrFn(void))(void);
~Test();

};

#endif

测试.cpp:

#include "test.hpp"

void (Test::*getPtrFn)(void){
return ptrFn;
};

Test::~Test(){}

编译错误

test.cpp:16:9: error: use of undeclared identifier 'ptrFn'

我对语言语法的理解是它们将被同等对待。那么是什么给了?

-杰夫

最佳答案

你需要

void(*Test::getPtrFn(void))(void)
{
return ptrFn;
}

而不是 void (Test::*getPtrFn)(void){...}void (Test::*getPtrFn)(void) 是将 getPtrFn 声明为不带参数的指向测试成员函数的指针 (void) 并返回 void,所以在你放置大括号 { ... } 之后你会得到一个编译时错误(就像试图声明 int i{/*some statemets*/>).

还有,不要忘记保留声明

void(*getPtrFn(void))(void);

在您的页眉中(现在您似乎没有它,您是否剪切/粘贴了它?)。看起来很可怕……所以真的,使用类型别名,它会让你的代码更干净。

using PTRFN = void(*)(void); // or typedef void(*PTRFN)(void);

class Test {
private:
PTRFN ptrFn;

public:
PTRFN getPtrFn(void);
Test(){};
~Test(){};
};

PTRFN Test::getPtrFn(void) // clear an concise
{
return ptrFn;
}

如果您真的很想破译您能想到的每一种指针声明,请尝试查看 clockwise/spiral rule ,我发现它非常有用,清晰易懂。然后在 cdecl.org 测试您的知识.

关于c++ - 在声明与实现中访问方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30203532/

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