无法将"this"的引用传递给另一个类的构造函数

Unable to pass a reference of 'this' to a constructor of another class

本文关键字:构造函数 另一个 引用 this      更新时间:2023-10-16

我们有一个class CJ,在它创建时,它创建了一个不同的class BA对象,它想要传递一个对自己的引用,如下所示:

BA:BA(const CJ& myCJRef);

编译器总是出错:

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

CJRefBA类中定义为类类型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:错误:' -> '令牌之前期望初始化器在成员函数' virtual void InputPoolBufferAdapter::notifyDataAvailable() '中:InputPoolBufferAdapter.cpp:38:32: error: expected initializer before。"令牌在成员函数' virtual void InputPoolBufferAdapter::bufferAdapterError(int) '中:InputPoolBufferAdapter.cpp:43:32: error: expected initializer before。"令牌

我很困惑,对于这个不再"困惑"但绝对是"困惑"的软件家伙,还有什么想法吗(我不敢相信,在C嵌入式系统工作了25年之后,这让我如此困惑!)

谢谢所有的

我需要猜测一下,但是您的类BA也有一个名为myCJRef的成员变量,对吗?它的类型是const CJ&,就像参数一样。在这种情况下,您需要这样做:

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

,因为需要初始化成员变量。

您应该发布一些代码。无论如何,在不使用任何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

假设BA有一个非静态成员const CJ& myCJRef。引用类型对象不能不初始化,因此需要确保该引用已由构造函数的成员初始化列表初始化。因此,构造函数的定义如下所示:

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

:之后的都是成员初始化列表。在本例中,它说用参数myCJRef初始化成员myCJRef(它们具有相同的名称是可以的)。