1

構造体を関数に渡すとき、プロトタイプ/ヘッダーはどのようになりますか? 構造体のメンバーを関数に渡すと、どのように見えるでしょうか?

例えば...

struct a_struct{
int a;
int b;
};

a_struct point;

void f1(a_struct)
void f2(a_struct)

そして、構造全体を f1 に渡したいのですが、メンバーだけを f2 に渡したいとしましょう。両方のパラメーターとしてデータ型 a_struct を使用しますか? または、intであるメンバーのみを渡しているため、f2のデータ型は異なります。これは、構造体の配列によって異なりますか? 私が書くことになっているプログラムは、構造体の配列を使用することになっています。これは、参照によって自動的に渡されることを除いて、大きな違いはないと考えました。

4

4 に答える 4

8

オブジェクトを(スカラー値だけでなく)渡すときは、メモリの所有権やコピーなどを考慮する必要があります。これは、関数のインターフェイスを宣言する方法について複数のオプションがあることを意味します。たとえば、参照渡しまたは値渡しができます。

考えられる宣言は次のとおりです。

void f1(a_struct& my_struct);

これにより、a_structオブジェクトへの参照が渡され、オブジェクトのコピーが防止されます。ただし、サンプルの構造にはスカラー値が含まれているだけなので、オブジェクトをコピーする可能性はそれほど心配する必要はありません。結果として、これで十分です。

void f1(a_struct my_struct);

構造体のメンバーを関数に渡す限り、関数はメンバーの型を取得するように宣言する必要があります。たとえば、a_structのメンバーを関数に渡すには、次のようにします。

void f1(int val);

最後に、配列は関数へのポインターとして入ってくるので、物事を複雑にします。たとえば、a_structオブジェクトの配列を渡すには、次のように宣言します。

void f1(a_struct* my_struct);

ただし、通常はパラメータを参照するだけで済みます。例えば:

my_structs[1];
于 2012-11-29T11:10:07.780 に答える
3

f1を取得するにはa_struct、内で編集できるようにするかどうかによって異なりますf1void f1(a_struct s);正常に動作し、コピーを作成します。void f1(const a_struct & s);参照を取りますが、それを変更することはできません(とにかく面倒なことなしに)。const非参照を避けるようにしています。

f2を取りたい場合はint、と書きvoid f2(int);ます。それがどこからint来たのか(つまり、内部structまたはそれ自体)は関係ありません。それからそれを次のように呼びますf2(point.b);

配列を受け取る関数は面倒な場合があり、それをどのように処理するかによって異なります。最も簡単な方法は、配列がポインターに縮退することを覚えておくことです。

void f3 (a_struct * const structArray)
{ /* Do something */ }
a_struct myArray[10];
f3(myArray);

これを行う他の(より良い)方法もあります。

編集:配列のすべての要素に関数を適用する場合は、(表面的には)2つのアプローチがあります(これについて考えると、実際には1つのアプローチにすぎません)。配列をループし、各要素をを受け取る関数にa_struct渡すか、配列全体を(サイズパラメーターも使用して)渡し、関数内でループします。つまり、あなたはそうするでしょう:

a_struct myArray[10];
for (int i = 0; i < 10; ++i)
{
    f1( myArray[i] );
}

// Or, better, from <algorithm>
std::for_each(myArray, myArray+10, f1);

これは範囲外のアクセスではないことに注意してください。逆参照されない限り、(これらのループ状況で正確に)配列の末尾から1つ離れたポインターを作成できることが保証されます。

もちろん、これはすべて、実際には配列ではなく配列が必要であることを前提としていますstd::vector(この場合、ループは基本的に同じように見えますが、begin()およびend()メンバー関数を使用する場合を除きます)。

実際、にアクセスできる場合は、とc++11を使用できます。これは、 sまたは配列に対してまったく同じように機能します。std::begin()std::end()vector

于 2012-11-29T11:11:32.670 に答える
0

構造体(またはクラス)を渡したい場合:

return_type fn_name(object_name)

メンバーの1人をパスしたい場合は、この場合を考えてみましょうa

return_type fn_name(int)

また、私が間違っていない限り、明示的に指定しない限り、すべての関数パラメーターはデフォルトで値を渡します。配列を渡す必要がある場合は、他のタイプと同じ構文になります。

于 2012-11-29T11:09:21.743 に答える
0

メンバー関数だけの値を渡したい場合は、その型を送信します。たとえば、パラメータとしてa_structの'a'を取る関数は、void func(int a);である必要があります。

ただし、値による呼び出しでは機能します。call be referenceを使用する場合は、ポインターを使用してください。

于 2012-11-29T11:09:56.190 に答える