2016-12-03 3 views
-1

Итак, сначала я не знаю, правильно ли я это указал или правильно инициализировал. В DOCO.h я объявил его как enum, а затем создал переменную get и set. Я не знаю, насколько это необходимо для переменной, которая используется только в этом классе, но более поздняя версия, возможно, должна иметь к ней доступ в подклассе ????получить и установить переменную Enum внутри класса?

Таким образом, объект DOCO перемещается по 2D-массиву, я хочу иметь возможность изменять направление DOCO, позволяя ему иметь переменную enum. Во-первых, так как кодер я знаю, о чем я говорю, чтобы указать его на такие имена, как Север, Юг, Восток и Запад, но чтобы программа могла преобразовать его в целочисленное значение.

DOCO.h

{ частное: ... перечисление D_direction;

public: 
... 
enum D_direction getD_direction(); 
void setD_direction(enum D_direction dir); 
} 

DOCO.cpp

DOCO::DOCO(void) 
{ 
enum D_direction *direction = 0; 
D_energy = 0; 
Mycell = NULL; 
Nextcell = NULL; 
} 

enum D_direction DOCO::getD_direction() 
{ 
enum D_direction dir; 

    //possible returns------ 
return *dir; 
    /*ERROR: no "*" matches these operands  
     operand types are: *DOCO::D_direction */ 

    return D_direction *dir 
    /*enum DOCO::D_direction, DOCO *Other_proK; 
     ERROR: typename is not allowed*/ 

    return dir; 
    /* DOCO::D_direction dir 
     ERROR: the return value type does not match the function type*/ 


} 

void DOCO::setD_direction(enum D_direction dir) 
{ 
enum D_direction {No_dir,NW,N,NE,E,SE,S,SW,W}; 
dir = static_cast<enum D_direction>(rand()%8+1); 
    //ERROR: a value type of "D_direction" can't be assigned to an 
    //entity of "DOCO::D_direction" 
} 

Так эта функция не совсем правильно, но это один из способов, который я хотел бы использовать перечисление D_direction * переменное направление. Я не думаю, что я делаю статический кастинг правильно.

bool DOCO::checkPosition(W_Cell *mc) 
//should the argument be bool *pos? Don't know if this needs to be used? 
{ 
//use the enum D_direction and pointer to next cell and determine 
//current cell is border cell and move is possible 
bool pos = false; 
//do I need to instantiate the W_Grid? 
while (row != -1 && col != -1) 
{ 
if (*direction == NW) 
{ 
    if ((col == 0) || (row == 0)) //top row or 1st col no NW 
     pos = false; 
    else 
     pos = (D_World)grid[row-1][col-1].isDoccupied(); 
      //can I set all of these true? 
} 
else if (*direction == N) 
{ 
    if (row == 0) //top row no N nextcell 
     pos = false; 
    else 
     pos = (D_World)grid[row-1][col+1].isDoccupied(); 
} 
else if (*direction == NE) 
{ 
    if ((row == 0) || (col = width - 1) 
      //top row or last col no NE nextcell 
     pos = false; 
    else 
     pos = D_World::grid[row-1][col+1].getDoccupied(); 
} 
else if (*direction == E) 
{ 
    if (col = width - 1) //last col no E nextcell 
     pos = false; 
    else 
     pos = (D_World)grid[row][col+1].isDoccupied(); 
} 
else if (*direction == SE) 
{ 
    if ((row == (height -1))||col == (width - 1))) 
     //last row or col no SE nextcell 
     pos = false; 
    else 
     pos = (D_World)grid[row+1][col+1].isDoccupied(); 
//or can I say this is setNextcell(dOC); 
} 
else if (*direction == S) 
{ 
    if ((row == (height -1)) //last row no S nextcell 
     pos = false; 
    else 
     pos = (D_World)grid[row+1][col].isDoccupied(); 
//or can I say this is setNextcell(dOC); 
} 
else if (*direction == SW) 
{ 
    if ((row == (height -1) || (col == 0)) 
     //last row or 1st col no SW nextcell 
     pos = false; 
    else 
     pos = (D_World)grid[row+1][col].isDoccupied(); 
//or can I say this is setNextcell(dOC); 
} 
else if (*direction == W) 
{ 
    if (col = 0) //1st col no W nextcell 
     pos = false; 
    else 
     pos = (D_World)grid[row][col-1].getDoccupied(); 
} 
else 
    pos = false; 
} 
return pos; 
} 

Эта функция показывает, как я хочу использовать эту переменную. У меня нет ошибок при вызове переменной, но я не знаю, правильно ли это использует. void DOCO :: setNextcell (W_Cell * nc) { W_Cell * Nextcell = new W_Cell; D_World * grid = новый D_World;

if (Nextcell= grid-> getCell(row, col)) 
{ 
    if (Nextcell -> getP_occupied()) 
      /*how to get pointer to where cell is on grid?*/ 
    this -> checkPosition(nc); 
      /*so this will point to grid->getCell(row,col)?*/ 

    if (Nextcell->getD_occupied()) 
     this -> getD_direction; 
} 
Nextcell = nc; 
} 

Так вот ошибки, которые, я думаю, я получаю с этим. В DOCO.h я не получаю никаких ошибок. Но в DOCO.cpp есть много ошибок. Я не знаю, что спросить, но вот что, по моему мнению, имеет отношение к моему вопросу. Я хочу использовать переменную enum для изменения направления DOCO вокруг блока в сетке. Я использую верхний (NW), верхний (N), верхний (NE), правый (E), нижний (SE), нижний (S), нижний (SW) и правый (W) в качестве моих направлений со строкой и col, чтобы установить направления. Надеюсь, это нелегкий глупый ответ, но, поскольку я не знаю, скажите, пожалуйста:

+0

Переместить ваше определение перечислимого вне тела функции – Eugene

ответ

0

При чтении предоставленного исходного кода я вижу некоторое колебание между переменной и указателем (enum D_direction *direction и should the argument be bool *pos?).

Чтобы был ясен, все простые типы переменных, как int, float, ... и enum могут быть введены или возвращаются из функции без необходимых указателя.

Чтобы использовать перечисление в классе, это действительно просто:

Step1 - декларация enum с class:

enum представляет собой набор символического параметра объявлен до использования

enum D_direction { D_None, 
     D_NW, D_N, D_NE, D_E, 
     D_SE, D_S, D_SW, D_W 
    }; 

В class, то enum используются как int с частной информацией и получить/установить общественные функции.

class DOCO { 
private: 
    enum D_direction e_dir; 
public: 
    DOCO(); 
    enum D_direction getD_direction(); 
    void setD_direction(enum D_direction dir); 
}; 

Step2 - Используйте enum в качестве естественного типа переменной.

DOCO::DOCO() 
{ 
    e_dir = D_None; 
} 

enum D_direction DOCO::getD_direction() 
{ 
    return (e_dir); 
} 

void DOCO::setD_direction(enum D_direction dir) 
{ 
    e_dir = dir; 
} 

Step3 - затем используйте enum с class:

DOCO vDoco; 
enum D_direction e_mydir; 

e_mydir = static_cast<enum D_direction>(rand()%(D_W-D_NW)+D_NW); //8+1); 
vDoco.setD_direction(e_mydir); 
+0

Спасибо! Мой профессор предложил сделать глобальную переменную, которая сработала, но у меня все еще есть проблема с функцией get ... хотя в качестве глобальной она, вероятно, не нужна ... а ... что я могу сказать, что я учусь. Я не думал об использовании переменных enum для установки параметров rand()%. Так снова спасибо, я попробую это. –

+0

Фактически, ** Step3 ** описывался как вставленный в вашу функцию 'main()' или любые другие. –

+0

Итак, читайте свой комментарий еще раз, я вижу, что вы говорили то же, что и мой профессор ... oops. : D –

Смежные вопросы