我正在尝试从键盘的快捷键修改一些变量[不需要来自同一个类/结构],类似于: 包含变量的foo结构:
struct Foo {
int a;
float b;
};
struct Foo2 {
int c;
};
主要是:
int main() {
Foo f;
Foo2 f2
void* p = &(f.a); //it could be &(f2.c)
if ('A' key activated) {
*p += 1;
}
}
目前,我已经陷入困境:
error: invalid operands to binary expression ('void' and 'int')
使其发挥作用的唯一方法是改变:
*p += 1;
人:
*(int*)p += 1;
这不是一个好的解决方案,因为我不应该知道p指向的类型。有没有办法做到这一点?
答案 0 :(得分:2)
将指针转换为void *会丢失类型信息,编译器将不知道如何递增。你为什么不改为指向Foo?
int main() {
Foo f;
Foo* p = &f;
if ('A' key activated) {
p->a += 1;
}
}
另请注意,增加浮点数不是一个好主意!
对于这个答案的评论中的问题:
struct FooBar
{
int *a;
float *b;
};
int main() {
Foo f;
Bar b;
FooBar fb{&f.a, &b.b};
if ('A' key activated) {
*(fb.a) += 1;
}
}
请注意,此解决方案颇为C风格。看看致命吉他的答案,以获得更多C ++风格的解决方案。
答案 1 :(得分:1)
编辑:起初我没有意识到你想要每个条目有不同的类型。基于处理键盘快捷键的任务,您可以使用多态类,并将其实例放入std :: map中:
class KeyHandler {
public:
virtual void onKeyStroke() = 0;
};
class MyHandler : public KeyHandler {
public:
MyHandler(int& value) : myValue(value) {}
virtual void onKeyStroke() {
myValue_ += 1;
}
private:
int& myValue_; // Other subclasses could have other data
};
// Now place instances of different Handlers into a std::map
typedef std::shared_ptr<KeyHandler> PKeyHandler;
std::map<char, PKeyHandler> bindings;
bindings['A'] = PKeyHandler(new IncrementIntHandler(&someInt));
bindings['B'] = PKeyHandler(new IncrementFloatHandler(&someFloat));
// The actual input handler then just invokes
// the correct handler for a key stroke.
bindings[keyCode]->onKeyStroke();
这样,您可以为要支持的每个操作定义一个处理程序类,并在这些类中实现相应的逻辑。您可以使基类的实现无需处理非映射键等。
答案 2 :(得分:0)
当然,请改用int
指针:
int * p = &f.a;
if ( /* condition */ ) { ++*p; }