- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个包含不同类的成员函数指针的映射。成员函数都具有相同的签名。为了做到这一点,我所有的类都继承了一个 Object 类,它只有默认构造函数、虚拟析构函数和一个虚拟 ToString() const 方法。
// The map looks like this
map<Object*, void (Object::*)()> mapOfMethodPointers;
// And here are the two classes that inherit Object
// Class A
class A : public Object
{
public:
void AFunc();
string ToString() const override;
};
void A::AFunc()
{
cout << "AFunc()" << endl;
}
string A::ToString() const
{
cout << "A" << endl;
}
// Class B
class B : public Object
{
public:
void BFunc();
string ToString() const override;
}
void B::BFunc()
{
cout << "BFunc()" << endl;
}
string B::ToString() const
{
cout << "B" << endl;
}
// Here is how add the member function pointers in the map
A a;
B b;
mapOfMethodPointers[*a] = &A::AFunc;
mapOfMethodPointers[*b] = &B::BFunc;
当我在映射中添加两个成员函数指针时,出现以下错误:
尽管 A 类和 B 类都是对象,但我无法进行这种转换。我怎样才能实现这样的目标?我需要成员函数指针的多态性。我选择的实现不起作用。有什么想法吗?
最佳答案
In order to do this all my classes inherit an Object class which only has default constructor, virtual destructor and a virtual ToString() const method.
对于存储具有相似签名的多态函数,这是一个糟糕的解决方案。
这里有两个更好的解决方案:
'1。将您的函数指针实现为基本接口(interface)的特化(在您的情况下为 Object
)。然后,在客户端代码中存储接口(interface)本身:
struct Object { virtual void Execute() = 0; }
/// old: map<Object*, void (Object::*)()> mapOfMethodPointers;
/// new:
std::vector<Object*> objects;
objects[10]->Execute(); // execution is agnostic of whichever instance you you use
在此解决方案中,Execute 将解析为 A::Execute
,定义如下:
class A : public Object
{
void AFunc();
public:
virtual void Execute() override { AFunc(); }
};
使用此解决方案,您不需要函数映射(因为 Object
的虚拟表 本质上是一个函数映射)。
'2。根据通用函数实现您的函数映射,然后用 lambda 表达式填充它:
代码:
/// old: map<Object*, void (Object::*)()> mapOfMethodPointers;
/// new:
map<Object*, std::function<void()>> mapOfMethodPointers;
// filling the map:
class A // not needed: public Object
{
public:
void AFunc(); // this is our interesting function
string ToString() const override;
};
A obj;
mapOfMethodPointers[&obj] = [&obj]() { obj.AFunc(); };
关于不同类成员函数指针的C++映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25265397/
所以我有这个 UltraTicTacToe 游戏,我正在用 HTML/CSS/JS 编码。它由表中表中的表组成。当您单击 X 或 O 时,我想要突出显示您应该进入的下一个 TicTacToe 牌 ta
Some text Some more text 如何让每个 .example 的 .whatever 包含其 .test 的内容? 例如,如果代码是这样的: Som
我是一名优秀的程序员,十分优秀!