1

作成時に、次のように自分自身への参照を渡したいclass CJ別のオブジェクトを作成します。class BA

BA:BA(const CJ& myCJRef);

コンパイラは常に次のエラーを出します:

エラー: 初期化されていない参照メンバー BA::myCJRef

CJRefBAクラス型としてクラスで定義されているCJ

の量&*またはどちらも何もしませんが、同じエラーが発生します。の初期化にはmyCJRef他の 2 つのクラスを渡す必要がありますが、間違ったオブジェクトを指すため、初期化は困難です。

私は「C」の男です...これは混乱しています。

皆さんありがとう!


以下の回答に従って、このポインターを使用して CJ オブジェクトのメソッドを呼び出すところまで到達しました。実際のコードは次のとおりです。

InputPoolBufferAdapter::InputPoolBufferAdapter (CJpsMixerChannel& _CJ、int ジッター、int maxBuffers、unsigned long maxBufferAge): myCJpsMixerChannel (_CJ)

{
        myCJpsMixerChannel = _CJ;

        myJitter = jitter;  // assuming jitter will be the number of floats

        myJitterCounter = 0;

        myMaxBuffers = maxBuffers;

        myMaxBufferAge = maxBufferAge;

        myPopulateMetadataRequests = 0;

        mySendDataReadyAlert = true;

        clearBufferAdapterThreshhold = CLEAR_BUFFER_ADAPTER_THRESHHOLD;
};    

void InputPoolBufferAdapter::returnDataBufferToPool (ChannelBuffer_t buf) 
{
    void CJpsMixerChannel::myCJpsMixerChannel->returnBufferToInputPool(ChannelBuffer_t *returnBuffer_p);
};

void InputPoolBufferAdapter::notifyDataAvailable ()
{
    void myCJpsMixerChannel.notifyDestinationsDataAvailable(void);
};

void InputPoolBufferAdapter::bufferAdapterError (int a)
{
    void &myCJpsMixerChannel.inputBufferAdapterError(int error_code);
};

ご覧のとおり、いくつかのことを試しましたが、コンパイルされません。エラーは次のとおりです。

InputPoolBufferAdapter.cpp: メンバー関数 'virtual void InputPoolBufferAdapter::returnDataBufferToPool(ChannelBuffer_t)': InputPoolBufferAdapter.cpp:33:50: エラー: '->' トークンの前にイニシャライザーが必要です。InputPoolBufferAdapter.cpp: メンバー関数 'virtual void InputPoolBufferAdapter:: notifyDataAvailable()': InputPoolBufferAdapter.cpp:38:32: エラー: '.' の前に初期化子が必要です トークン InputPoolBufferAdapter.cpp: メンバー関数 'virtual void InputPoolBufferAdapter::bufferAdapterError(int)': InputPoolBufferAdapter.cpp:43:32: エラー: '.' の前に初期化子が必要です トークン

私は途方に暮れています.これ以上のアイデアはもはや「混乱」ではなく、間違いなく「困惑」したソフトウェアの男です.

皆さんありがとう

4

3 に答える 3

2

少し推測する必要がありますが、あなたのクラスBAには というメンバー変数もありますmyCJRefよね? const CJ&パラメータと同様に、その型はです。その場合、これを行う必要があります。

BA::BA( const CJ& r ) : myCJRef( r )
{
  // note: myCJRef = r; would not work here.
}

メンバー変数を初期化する必要があるためです。エラーは、ctor のパラメーターを参照していません。

于 2013-03-28T21:19:42.203 に答える
1

おそらくBA、非静的メンバーがありconst CJ& myCJRefます。参照型オブジェクトを初期化しないままにすることはできないため、この参照がコンストラクターのメンバー初期化リストによって初期化されていることを確認する必要があります。したがって、コンストラクターの定義は次のようになります。

BA::BA(const CJ& myCJRef)
  : myCJRef(myCJRef)
{
  // ...
}

の後のすべて:は、メンバーの初期化リストです。この場合、myCJRef引数を使用してメンバーを初期化しますmyCJRef(同じ名前でもかまいません)。

于 2013-03-28T21:19:27.170 に答える
1

コードを投稿する必要があります。とにかく、C++11 構文を使用せずに、これは私が行く方法です:

CJ::CJ() : BA(*this) { //CJ constructor here }

BA::BA(const CJ& myCJ) : myCJref(myCJ) { //BA constructor here }

ここでは、CJ および BA コンストラクターのみを記述しました。これが機能するには、BA にデータ メンバー const CJ と myCJref が必要です。

于 2013-03-28T21:21:42.467 に答える