2011-11-11 17 views
4

私の知る限り、コンストラクタはインプリメンテーションファイルで定義する必要がありますが、クラスを持つサンプルを.hと.cppファイルに分割するのではなく、1つのメインファイル内で見つけることができました実装とヘッダのコンストラクタ

私の次のコードは、許容可能な方法で分離されている場合、私が知っておく必要があるのは..です

Entity.h:

using namespace std; 

class cEntity { 
private: 
    /*----------------------------- 
    ----------Init Methods--------- 
    -----------------------------*/ 
    int *X, *Y; 
    int *Height, *Width; 

public: 
    /*----------------------------- 
    ----------Constructor---------- 
    -----------------------------*/ 
    cEntity (int,int, int, int); 

    /*----------------------------- 
    ----------Destructor----------- 
    -----------------------------*/ 
    ~cEntity(); 

    /*----------------------------- 
    ----------Set Methods---------- 
    -----------------------------*/ 

    /*Set X,Y Methods*/ 
    void setX(int x){*X=x;}; 
    void setY(int y){*Y=y;}; 
    void setXY(int x, int y){*X=x; *Y=y;}; 

    /*Set Height, Width Methods*/ 
    void setHeight(int x){*Height=x;}; 
    void setWidth(int x){*Width=x;}; 
    void setDimensions(int x, int y){*Height=x; *Width=y;}; 

    /*----------------------------- 
    ----------Get Methods---------- 
    -----------------------------*/ 

    /*Get X,Y Methods*/ 
    int getX(){return *X;}; 
    int getY(){return *Y;}; 

    /*Get Height, Width Methods*/ 
    int getHeight(){return *Height;}; 
    int getWidth(){return *Width;}; 
}; 

とEntity.cpp:

#include "Entity.h" 


cEntity::cEntity (int x, int y, int height, int width) { 
    X,Y,Height,Width = new int; 
    *X = x; 
    *Y = y; 
    *Height = height; 
    *Width = width; 
} 

cEntity::~cEntity() { 
    delete X, Y, Height, Width; 
} 

私はまた、特に私の最初の質問に非常に役立ってくれている皆様に感謝したいと思います!

+0

boost.shared_ptr/boost.scoped_ptrを調べることをおすすめします。彼らは破壊時の削除を処理し、メモリリークのリスクは低くなります。また、そうしない理由がない限り、デストラクタを 'virtual'にしてください。 – moshbear

+2

ポインタ以外の型を調べることをお勧めします。 – avakar

+4

'delete X、Y、Height、Width;'これはあなたが思っていることをしません。 –

答えて

2
cEntity::cEntity (int x, int y, int height, int width) { 

は正しい

X,Y,Height,Width = new int; 

あまりないです。その結果、Widthは新しいintに設定されますが、残りは設定されません。

X = new int(x); 
    Y = new int(y); 
    Height = new int(height); 
    Width = new int(width); 

この作成方法は、参照などの割り当て/コピーのないオブジェクトでは機能しません。いくつかのオブジェクトでは、それらを適切な場所に構築するよりも時間がかかります。そのため、構築する好ましい方法はそうのようなものです:

cEntity::cEntity (int x, int y, int height, int width) { 
    :X(new int(x)) 
    ,Y(new int(y)) 
    ,Height(new int(height)) 
    ,Width(new int(width)) 
{} 

これは良いですが、任意の例外がスローされた場合は、何らかの形で配分されたものを解放する必要があります。これらのメンバーのそれぞれをstd::unique_ptr<int>にする方が良いので、自分自身の割り当てを解除し、多くの頭痛を軽減します。

+0

おかげさまで、私には別の工法を教えてくれてありがとう。私はこのすべてにはとても新しいですが、私は学びようとしています:P –

+2

あるいは、それらを指針にしないでください。その割り当てはオブジェクト自体の中にあり、cEntityオブジェクトが破棄されたときに解放されます。 –

+0

@MichaelPrice:私は彼らが理由のあるポインタだと思ったが、良い点を挙げる。 –

0

はい。少なくとも分離するためには、一般的にそれを行うのが最良の方法です。

実際の実装については、いくつかの問題があります。私はあなたがコンストラクタで何をしようとしているのか、クラス・メンバー変数のデータ型が正しいかどうかは分かりませんが、何か問題があるようです。

+0

@avakarうん、これは私が言ったことだ – Pepe

+1

@PR、右、右、忍者は編集:) – avakar

1

分離は問題ありません。これらの関数の実装は間違っていますが、宣言から適切に分離しています。 (彼らはあなたが思うように多くのオブジェクトを割り当てたり、解放したりしません。)

3

はい、問題ありません。 ただし、コンストラクタとデストラクタに問題があります。 あなたのコードが実際に行うことは、1つのintを割り当てることであり、デストラクタは1つのintも割り当てを解除することです。 とにかく、ここでポインタを使う必要はありません。 やや良く実装(私たちはスマートポインタを使用しない場合)、次のようになります。

[Entity.h]

private: 
    /*Private fields*/ 
    int X, Y; 
    int Height, Width; 

[Entity.cpp]

cEntity::cEntity (int x, int y, int height, int width) { 
    X = x; 
    Y = y; 
    Height = height; 
    Width = width; 
} 
cEntity::~cEntity() { 
} 

そして、もう一つ。ヘッダーファイルにusing namespace std;が表示されないようにしてください。そうした場合、ヘッダーを含む人にこのusingステートメントを使用させることになり、名前空間の衝突を引き起こす可能性があります。

+0

それは最高のだけの 'std ::'を使用するか、名前空間を除外する別の方法はありますか? –

+0

Nick、この質問を参照してください:[私は "using namespace std"をヘッダーに入れてはいけないのですか?](http://stackoverflow.com/questions/3186226/) –

+0

あなたのstd名前空間にアクセスする必要はありません。ここにコードしてください。そして、必要なときに 'std ::'を使います。 –

-1

クラス内で直接定義されたメソッドは、コンストラクタを含め、暗黙的にインライン展開されます。

I.e.

class MyClass 
{ 
public: 
    MyClass(); 
}; 

MyClass::MyClass() 
{ 
}; 

がインライン化されていないので、これらの利点を持っていないのに対し

class MyClass 
{ 
public:  
    MyClass() {}; 
}; 

は、コードのパフォーマンスを改善することができる(または、なくてもよい)インラインコンストラクタを定義

。どちらのオプションも正しいC++です。

ちょうど私の2セントです。

P.Sはい、このようにクラス内にポインタを格納することにした場合は、Pandoraボックスを開きます。

+0

を読むでしょう。このシナリオの実装ファイルをスキップし、インラインコンストラクタを使用しますか? –

+0

に依存します。インターフェースは、短く、きれいで、理解しやすいものです。あなたのコンストラクタにたくさんのコードがあると、それはあなたのインターフェイスファイルを汚染します。あなたの4行のコンストラクタはおそらくOKです。 – AlexK

+0

"クラスに直接定義されているメソッドはすべて暗黙的にインライン展開されています"とは本当に意味がありません。コンパイラは、実装定義の振る舞いに基づいて何かがインライン展開されるかどうかを判断します。 –

関連する問題