从void指针增加值

时间:2013-01-19 22:36:58

标签: c++ pointers

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

3 个答案:

答案 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; }