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 に答える