gpt4 book ai didi

c++ - 函数指针的静态映射

转载 作者:行者123 更新时间:2023-11-30 03:31:22 24 4
gpt4 key购买 nike

我正在尝试在 C++ 中实现类似于 C# setter 的东西。这个想法是有一个类属性的枚举和相应的 setter 。我的代码如下所示。我将在类定义中编写实现。

#include <string>
#include <map>

enum ClassProperties
{
Id, Name
};

class MyClass
{
public:
int Id;
std::string Name;

public void SetValue(ClassProperties c, std::string value){
setters[c](this, value);

}

private:
typedef void (* t_setter)(MyClass *, std::string);

static void set_id(MyClass * obj, std::string value) {
obj->Id = std::stoi(value);
}
static void set_name(MyClass * obj, std::string value) {
obj->Name = value;
}

static std::map<ClassProperties, t_setter> setters = {{ClassProperties:: Id, set_id}, {ClassProperties::Name, set_name}};


};

我希望这段代码选择对应的函数并调用它,但我在最后一行遇到错误

error: in-class initialization of static data member ‘std::map<ClassProperties, void (**)(MyClass*, std::basic_string<char>)> MyClass::setters’ of incomplete type

error: could not convert ‘{{Id, MyClass::set_id}, {Name, MyClass::set_name}}’ from ‘<brace-enclosed initializer list>’ to ‘std::map<ClassProperties, void (**)(MyClass*, std::basic_string<char>)>’

我做错了什么?

最佳答案

您对 setters 的初始化是错误的。您应该按如下方式更改它:

1) 从类主体中删除行:

static std::map<ClassProperties, t_setter> setters =
{{ClassProperties:: Id, set_id}, {ClassProperties::Name, set_name}};

2) 在类主体外添加适当的静态成员初始化:

std::map<ClassProperties, MyClass::t_setter> MyClass::setters = {
{ ClassProperties::Id, &MyClass::set_id },
{ ClassProperties::Name, &MyClass::set_name }
};

此外,您必须在 SetValue 函数之前删除 public 说明符。

wandbox example

关于c++ - 函数指针的静态映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44242575/

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