gpt4 book ai didi

c++ - 前向声明类的成员函数指针

转载 作者:可可西里 更新时间:2023-11-01 18:36:55 24 4
gpt4 key购买 nike

头文件 common.h 前向声明了一个类 Test 和一个接收成员函数指针的函数:

class Test;

void func(const Test &t, int (Test::*f)() const, int x, int y);

在源文件 target.cpp 中,我定义了这样的函数

#include "common.h"

void func(const Test &t, int (Test::*f)() const, int x, int y) {
std::cout << "f: " << (t.*f)() << ", x: " << x << ", y: " << y << std::endl;
}

在我的主文件中,我定义了类 Test 并使用函数 func:

class Test {
public:
int example() const { return 1; }
};

#include "common.h"

int main() {
Test t;
func(t, &Test::example, 0xaaaaaaaa, 0xbbbbbbbb);
return 0;
}

显然这有点臭,因为指向成员函数的指针有时不仅仅是一个简单的指针。但由此产生的行为有点让人不知所措:给定的参数 0xaaaaaaaa0xbbbbbbbb 不会正确传递给函数。或者更准确地说,函数 func 对给定堆栈的解释与调用者将数据压入堆栈的方式不同。 f 的大小取决于该类是仅前向声明的还是实际定义的。使用 Visual Studio 2013 编译的输出是:

f: 1, x: 0, y: 2130567168

我想,如果前向声明就足够了,真的是否给出定义并不重要。

最佳答案

默认情况下,MSVC 更看重速度而不是成员指针的正确性。您可以通过传递编译器标志 /vmg 来强制它按照标准工作。 .

关于c++ - 前向声明类的成员函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22192211/

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