0

我正在尝试从键盘的快捷方式修改一些变量[不需要来自同一个类/结构],如下所示: 包含变量的 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 指向的类型。有没有办法做到这一点?

4

3 回答 3

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++ 风格的解决方案。

于 2013-01-19T22:39:59.603 回答
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();

这样,您可以为要支持的每个操作定义一个处理程序类,并将相应的逻辑实现到这些类中。您可以使基类的实现不做任何事情来处理非映射键等。

于 2013-01-19T22:46:18.913 回答
0

当然,请改用int指针:

int * p = &f.a;

if ( /* condition */ ) { ++*p; }
于 2013-01-19T22:44:06.050 回答