Как вы передаете перечисление по ссылке? - PullRequest
2 голосов
/ 06 марта 2011

У меня есть enum с четырьмя ключами, которые я беру в качестве ввода для интерфейсной программы, и я хотел бы передать enum по значению в интерфейсную функцию, которая стала довольно длинной. Перечисление выглядит так:

enum MYKEYS {
  W, S, O, L
};

Есть также логический массив, который я должен передать по ссылке, что тоже немного сложно.

bool key[4] = { false, false, false, false };

Кто-нибудь знает правильный синтаксис для передачи их обоих в качестве ссылки в функции, аналогично:

function(int & anintreference);

Ответы [ 4 ]

7 голосов
/ 06 марта 2011

Вы не можете передать enum в качестве параметра вашей функции! enum определяет новый тип, и вы можете создать переменную этого типа, которая может принимать одно из значений, определенных enum:

MYKEYS k = W;

Только тогда вы можете передать k по ссылке на некоторую функцию:

function foo(MYKEYS& k_);

Относительно вашего второго вопроса, поскольку вы должны думать о массиве как о указателе на серию bool:

function bar(bool* key, int length);
3 голосов
/ 06 марта 2011

Для массива bool просто возьмите указатель bool* keys.Это работает, потому что массивы распадаются на указатели при передаче в функцию:

bool key[4] = {false, false, false, false};
void FuncThatTakesABoolArray(bool* keys){
    bool key1 = keys[0];
    // etc...
}

Для перечисления Грег уже ответил на это.

0 голосов
/ 13 декабря 2013

Просто используйте этот способ в вашей программе:

foo(*new MYKEYS(MYKEYS::W));

И определение / определение foo таково:

void foo(MYKEYS &newMYKEYS){
    //
}
0 голосов
/ 06 марта 2011

С помощью enum вы определяете новый тип в вашей программе.Этот тип ведет себя так же, как любой тип.Тогда передача по значению будет:

void myFunction( MYKEYS key );

И передача по ссылке:

void myFunction( MyKEYS& key );

Если ключ не будет изменен, лучше объявить константную ссылку:

void myFunction( const MyKEYS& key );

Относительно вектора:

Векторы всегда передаются по ссылке в C ++, и вам не нужен указатель для этого.Синтаксис немного отличается от нормального типа.

void myFunction( bool keyVector [ ] );

Передача по ссылке обычно лучше, чем указатель, потому что кто-то может передать NULL-указатель на вашу функцию и прервать программу, если вы не проверите указательранее.

В матрице (векторе векторов) вы должны указать все измерения, кроме первого:

bool keysOfKeys[4][3];

void myFunction( bool vector [ ] [ 3 ] );

Есть лучшая форма, чтобы сделать это без вектора bools.

Вы можете использовать операторы & (поразрядно и) и (| поразрядно или) и использовать каждый бит как логическое значение.Напомним, что перечисление ведет себя как int.

Например, если пользователь нажал клавиши W и S.

enum MYKEYS
{
    W = 1<<0, // ..0001 ( binary ) 
    S = 1<<1, // ..0010 ( binary )
    O = 1<<2, // ..0100 ( binary )
    L = 1<<3 //  ..1000 ( binary )
};

MYKEYS k;
k = W | S;      // W and S pressed: ..0011 ( binary )

void myFunction( eKey key )
{
    // ..0011 & ..0001 -> ..0001
    if (  ( key  & W ) == W ); // key W pressed 

   // ..0011 & ..0010 -> ..0010
   if( ( key & S ) == S ); // key S pressed
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...