1

我们有一个class CJthat 在创建时,它会创建一个不同的class BA对象,它希望向其传递对自身的引用,如下所示:

BA:BA(const CJ& myCJRef);

编译器总是出错:

错误:未初始化的引用成员 BA::myCJRef

CJRef在类中定义BA为类类型CJ

现在的数量&*或者什么都不做,只会导致同样的错误。初始化很困难,因为初始化myCJRef需要传递另外两个类,但它会指向错误的对象。

我是一个'C'家伙......这令人困惑。

谢谢大家!


按照下面的答案,我到了使用这个指针调用 CJ 对象中的方法的地步,真正的代码如下:

InputPoolBufferAdapter::InputPoolBufferAdapter (CJpsMixerChannel& _CJ, int jitter, 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: error: '.' 之前的预期初始化程序 令牌 InputPoolBufferAdapter.cpp:在成员函数“virtual void InputPoolBufferAdapter::bufferAdapterError(int)”中:InputPoolBufferAdapter.cpp:43:32:错误:“。”之前的预期初始化程序 令牌

我很茫然,对于这个不再“困惑”但绝对是“迷惑”的软件人的任何想法(我不敢相信在“C”嵌入式系统工作了 25 年后,这让我搞砸了!)。

谢谢大家

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 回答