2017-11-26 9 views
1

で直接操作から構造体のメンバを保護する方法:彼は、プログラマが自分のコードでこのファイルが含まれている場合なぜ私は、我々は.hファイルに次のコードがあるとしましょうC

typedef struct 
{ 
    float velocity[2]; 
    float position[2]; 
    float rotation; 
} Bullet; 


void Bullet_init(Bullet *bullet, float position[2], float velocity[2], float rotation) 
{ 
    bullet->rotation = rotation; 
    bullet->velocity[0] = velocity[0]; 
    bullet->velocity[1] = velocity[1]; 
    bullet->position[0] = position[0]; 
    bullet->position[1] = position[1]; 
    return; 
} 

をことができませんでしたBullet_init関数を使用する代わりに、単に構造体を直接bullet.velocity [2] = 5で変更しますか?プログラマが関数を適切に使うことを単に信頼する必要はありますか? C++では、メンバー関数でのみ操作できるプライベートメンバーを持つクラスを作成できます。これはCで単純ではありませんそれは重要ですか?

+2

構造体のプロトタイプを公開していない場合、関数を使用して箇条書きの型を操作する必要があります。 – Aif

+1

なぜ、関数Bullet_init()の定義をヘッダファイルに含めるのですか?ヘッダーファイルは宣言用であり、定義用ではありません。 –

答えて

4

Cでは、プログラマを信頼するか、構造体定義をパブリックインタフェースの一部にしないでください。

あなたは、たとえば(ヘッダファイルで)かもしれない:

typedef struct some_struct some_struct; 
int some_struct_get_member(some_struct * ptr); 
void some_struct_set_memember(some_struct * ptr, int newValue); 

そしてあなたの.cファイル内:構造体が持っている場合は、この操作を行う可能性がある理由については

#include <assert.h> 

struct some_struct { int member; }; 

int some_struct_get_member(struct some_struct * ptr) { 
    assert(ptr); 
    return ptr->member; 
} 

void some_struct_set_member(struct some_struct * ptr, int newValue) { 
    assert(ptr); 
    ptr->member = newValue; 
} 

限定されたインターフェースだけがそれらの内部を操作するように複雑な内部要求があると、値が常に理にかなっています。

+2

読み取り専用関数のパラメータ型に 'some_struct const *'を使うのは良い考えです –

関連する問題