C++静态函数指针

3

我希望在我的类中拥有一个私有的静态函数指针,大致上应该是这样的:

//file.h
class X {
private:
    static int (*staticFunc)(const X&);
    ...
public:
    void f();

};


//file.cpp
void X::f()
{
    staticFunc(*this);
}

这给我带来了一个“未解决的外部符号”错误。我知道静态成员也必须在.cpp文件中初始化,我已经尝试过这样做:
int (X::*staticFunc)(const X&) = NULL;

但这给了我一个“初始化函数”的错误。如果我尝试使用现有函数来初始化它,它会给我一个更丑陋的错误。如果没有“= NULL”,我会得到相同的错误。
谢谢。

你尝试在.cpp文件中使用staticFunc = NULL;了吗?(注意:我忘记了在.cpp文件中是否需要重新声明类型,抱歉) - Platinum Azure
抱歉,我是在匆忙中编写代码的。我现在已经纠正了它,当使用staticFunc时,我当然会传递一个参数。实际上,在.cpp文件中,我写的是"int (X::*staticFunc)(const X&)"而不是"int (*X::staticFunc)(const X&)"。非常感谢您的回答,这是一个愚蠢的错误。 - stonecup64
3个回答

4
//file.cpp  
int (*X::staticFunc)(const X&);

void X::f()  
{  
staticFunc(*this);  
}

没错。直白地说,类中的“static”数据成员声明仅仅是一个声明 - 它还需要在类外部单独进行定义,且只能在一个翻译单元(源代码文件)中进行。 - j_random_hacker
你可以在 X::staticFunc 的定义中添加一个初始化器 = NULL= &someFunc。你需要用 X:: 来限定静态成员的名称,否则 C++ 会认为你正在创建一个不同的声明。 - aschepler
“= NULL”是多余的。这是有保证的。 - TonyK

2
它是X的成员,所以你需要说明。
int (*X::staticFunc)(const X&) = NULL;

否则,你只会创建一个名为staticFunc的全局变量,这与X的静态成员无关。

0

这里有几个问题。

第一个错误是你在尝试使用 staticFunc 时没有传递参数。这应该会导致编译器错误,但你没有报告。

第二个问题是你的语法有误。TonyK 已经指出了这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接