Встроенная функция как метод класса - PullRequest
2 голосов
/ 22 января 2012

Я разработал свой собственный класс Matrix. Конструктор читает матрицу из файла. Матрица имеет свободные ячейки и «стены». Также конструктор считывает начальную и конечную точки для поиска в ширину (чтобы найти кратчайший путь от начальной точки до конечной точки). Вот код заголовка:

// MyMatrix.h file

#ifndef __MYMATRIX_H__
#define __MYMATRIX_H__

#include <tchar.h>
#include <iostream>
#include <deque>

//using namespace std;
#define MAX_MATRIX_SIZE 1000

#define FREE_CELL_SIGNIFICATION '0'
#define BALL_SIGNIFICATION 'B'
#define UP_SIGNIFICATION 'U'
#define DOWN_SIGNIFICATION 'D'
#define LEFT_SIGNIFICATION 'L'
#define RIGHT_SIGNIFICATION 'R'
#define START_POINT_SIGNIFICATION 'S'
#define FINISH_POINT_SIGNIFICATION 'F'

typedef std::pair<int,int> Field_Point_Type;

//#define IS_RIGHT_NEIGHBOUR_REACHABLE(Current_Point) (((Current_Point.second+1) <= Column_Count)&&((Matrix_Field[Current_Point.first][Current_Point.second+1]==FREE_CELL_SIGNIFICATION)||(Matrix_Field[Current_Point.first][Current_Point.second+1]==FINISH_POINT_SIGNIFICATION))) ? true : false;



class Matrix {
    private:
        int Column_Count; //Cols
        int Row_Count;//Rows
        char** Matrix_Field;
        Field_Point_Type Start_Point;
        Field_Point_Type Finish_Point;
        bool Matrix_Is_Correct;
    public:
        Matrix(_TCHAR* Input_File_Name);
        int Breadth_first_search(unsigned int Start_X,unsigned int Start_Y,unsigned int Finish_X,unsigned int Finish_Y);
        ~Matrix();
        inline int IS_RIGHT_NEIGHBOUR_REACHABLE(Field_Point_Type Current_Point);
};

// Файл MyMatrix.cpp

...

inline int Matrix::IS_RIGHT_NEIGHBOUR_REACHABLE(Field_Point_Type Current_Point)
{      
    return  (((Current_Point.second+1) <= Column_Count)&&((Matrix_Field[Current_Point.first][Current_Point.second+1]==FREE_CELL_SIGNIFICATION)||(Matrix_Field[Current_Point.first][Current_Point.second+1]==FINISH_POINT_SIGNIFICATION))) ? true : false;
}

...

Я бы хотел определить, свободны ли соседние ячейки для следующего шага алгоритма. Конечно, я могу использовать такой код для этого:

if (((Current_Point.second+1) <= Column_Count)&&((Matrix_Field[Current_Point.first][Current_Point.second+1]==FREE_CELL_SIGNIFICATION)||(Matrix_Field[Current_Point.first][Current_Point.second+1]==FINISH_POINT_SIGNIFICATION))) {
    //Adding of right cell to deque...
    ... 
}

но выглядит уродливо. Я собираюсь добавить такие проверки для левых, вверх и вниз клеток. Я хотел бы реализовать встроенные функции (например: inline int IS_RIGHT_NEIGHBOUR_REACHABLE(Field_Point_Type Current_Point);).

if (IS_RIGHT_NEIGHBOUR_REACHABLE(Current_Point)) {
    //Adding of right cell to deque...
    ... 
}

выглядит намного лучше! Но я раньше не использовал такое определение встроенной функции и обнаружил ее случайно. Это хороший стиль программирования? Что лучше разработать простой метод int IS_RIGHT_NEIGHBOUR_REACHABLE(Field_Point_Type Current_Point); в моем классе? Лучше оставить такой чек:

if (((Current_Point.second+1) <= Column_Count)&&((Matrix_Field[Current_Point.first][Current_Point.second+1]==FREE_CELL_SIGNIFICATION)||(Matrix_Field[Current_Point.first][Current_Point.second+1]==FINISH_POINT_SIGNIFICATION))) {
    //Adding of right cell to deque...
    ... 
}

Ответы [ 2 ]

3 голосов
/ 22 января 2012

Я не думаю, что у нас еще есть установленный "хороший стиль".Компиляторы, способные встраивать функции из отдельно скомпилированного файла .cpp, являются сравнительно недавними моделями самых популярных компиляторов.

Еще пару лет назад все встроенные функции были в файле .h, так что компилятормог видеть это во время компиляции вызова.Если ваш компилятор не последняя модель, это может быть правилом.

1 голос
/ 22 января 2012

inline Функции должны быть реализованы в заголовочных файлах. Если это действительно улучшает вашу производительность, вы должны проверить с помощью тестов.

Однако хорошие компиляторы могут встроить функции автоматически (надеюсь).

На ваш вопрос, я бы предпочел иметь много маленьких функций. Обычно их легче обслуживать, и их можно проверить по отдельности, если они правильные.

...