0

経験の浅いコードでかなり発生しているように見えるので、しばらく疑問に思っていました。

switch ステートメントを頻繁に使用するコードがありますが、実際には毎回異なるキューにアクセスするだけです。

void store(int toSwitchOn, float posx, float posy){ 
    myDataStruct newValue;
    newValue.psX = posx;
    newValue.psY = posy;

    switch(toSwitchOn){
        case 1:
            queue1.push(newValue);          
            break;
        case 2:
            queue2.push(newValue);          
            break;
        case 3:
            queue3.push(newValue);
            break;
        case 4:
            queue4.push(newValue);
            break;
        case 5:
            queue5.push(newValue);
            break;
    }


}

各ステートメントで変更されるのは、キュー変数だけです。この種の繰り返しコードを凝縮する独創的な方法はありますか?

4

3 に答える 3

5

キューをベクトルに保存します。

std::vector<std::queue<someType> > queues (5);
//fill vector with your 5 queues

//this replaces the switch:
if (toSwitchOn >= 1 && toSwitchOn <= 5)
    queue [toSwitchOn - 1].push (newValue);
else
    //default switch case
于 2012-04-23T20:44:27.363 に答える
0

明らかな答えは、スイッチを入れるものをswitchavectorまたはlookup に置き換えることです。map

ただし、整数とベクトル インデックスの間のカップリングが漏れやすいインターフェイスであることがわかります。

この関数の呼び出し元が使用する整数値をどのように知っているかを知りたいです。誰が彼らに何を使うように言いましたか? Storage代わりに、オブジェクトへの参照が与えられただけでしょうか?

交換:

int function_telling_which_index_to_use_for_storage();

と:

Storage* storage_to_use();

次に、次のように言うことができます。

Storage* storage = storage_to_use();
// ...
storage->store(posx, posy);

覚えておいてください:カプセル化、カプセル化、カプセル化。

于 2012-04-23T21:09:44.873 に答える
0
std::vector<std::queue<someType> > queues (5); 
//toSwitchOn is of type size_t and zero indexed.
... 
if (toSwitchOn < queues.size())
   queue [toSwitchOn].push (newValue);  //0 - 1 = undefined land...     
else     //default switch case 
于 2012-04-23T20:51:24.037 に答える