2

私が取り組んでいる問題は、クラス本体内で istream コンストラクターを定義するように求めていることです。クラスをSoundと呼びましょう。現在、このコンストラクターは独自の本体で関数を使用しています。ただし、関数は非メンバー関数である必要があります。別のファイルで定義していますが、クラス定義自体を含むヘッダーで宣言しています。非メンバー関数を既に含む他のファイルにヘッダーを配置しました。

問題は、非メンバー関数のパラメーターの 1 つに Sound 型があり、それが Sound オブジェクト型に対して操作を実行することです。

この関数をヘッダー ファイルで宣言するときに、クラス定義の前に置くと、オブジェクトが定義されていないというエラーが表示されます。

宣言を定義の後に置くと、コンストラクターは、その本体内の関数が未定義であることを通知します。

クラス本体に宣言を入れるとメンバー関数になります。

この問題は、関数をメンバー関数にすることができないと明示的に述べていないため、このキャッチ 22 を克服する方法があるかどうか疑問に思っています。

4

3 に答える 3

2

必ずしも関数メンバーにする必要はありません。別の方法で解決するには、少なくとも 2 つの方法があります。

問題は、私が正しく理解している場合、Sound オブジェクトがまだ定義されていない状況でこれらすべてが発生していることです。

1) 以下に示すように、コードを少しリファクタリングできます。

headerファイル:

class Sound
{
public:
    Sound();

    doStuff();
}

cppファイル:

void non_member_function(Sound sound)

Sound::Sound() { non_member_function(*this); }
Sound::doStuff() {}

void non_member_function(Sound sound) { sound.doStuff(); }

2) 前述のシナリオを主張する場合はSound sound、型を認識させるために、非メンバー関数の前に前方宣言を置きます。または、クラス宣言の後に宣言を配置することもできます。

headerファイル:

class Sound
{
public:
    Sound();

    doStuff();
}

void non_member_function(Sound sound)

cppファイル:

Sound::Sound() { non_member_function(*this); }
Sound::doStuff() {}

void non_member_function(Sound sound) { sound.doStuff(); }
于 2013-08-30T21:53:27.060 に答える
1

関数の前に、クラスの前方宣言を使用するのが最善のようです。

ヘッダ:

class Sound;

void f(Sound s);

class Sound
{...};
于 2013-08-30T23:54:32.467 に答える
0
  • C++ では、関数をメンバー関数または非メンバー関数として定義できます。あなたが指摘したように、関数をメンバーまたは非メンバーとして定義することが指定または要求されていない場合、私は簡単または単純な解決策を選択します。
  • コンストラクター内で非メンバー関数を呼び出すには、特定の手法を使用してこの関数呼び出しを行う必要がある場合がありますが、関数がメンバー関数として定義されている場合は不要になる可能性があります。
于 2013-08-30T22:56:50.790 に答える