2012-01-22 10 views
2

私自身のMatrixクラスを開発しました。コンストラクタはファイルから行列を読み込みます。マトリックスには自由な細胞と「壁」があります。また、コンストラクタは、幅優先検索(Start_pointからFinish_Pointまでの最短方法を見つけるため)の開始点と終了点を読み込みます。ここ は、ヘッダのコードです:私は定義したい//MyMatrix.hファイルクラスメソッドとしてのインライン関数

#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... 
    ... 
} 
+1

CPPファイルにインライン関数を実装しないでください! – Goz

+1

(OT:[あなたの投稿に敬意を表して "Friends!"を入れないでください](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed- C++を先頭に置かないと、最も高いタグがページの 'title'に自動的に付加されます。そこにC++を挿入したい場合は、タイトル文の中にそれを流し込みます。 ) – Mat

+0

OK、Mat。これで申し訳ありません。 –

答えて

3

私はまだ「良いスタイル」が確立しているとは思わない。別々にコンパイルされた.cppファイルの関数をインライン展開できるコンパイラは、最も一般的なコンパイラのかなり最近のモデルです。

数年前までは、すべてのインライン関数を.hファイルに入れておく必要があったため、コンパイラは呼び出しをコンパイルする際にコンパイラに認識させることができました。あなたのコンパイラが最新のモデルでない場合、それは依然としてルールかもしれません。

1

inline関数はヘッダファイルに実装する必要があります。パフォーマンスが実際に向上する場合は、ベンチマークで確認する必要があります。

しかし、良いコンパイラでは、自動的に(うまくいけば)インライン関数があるかもしれません。

ご質問には、私は多くの小さな機能を持つことをお勧めします。通常は保守が容易で、正しい場合は個別にチェックすることができます。

関連する問題