尝试按照本文中显示的示例http://goo.gl/DvglYv我设计了以下类:
Bridge.h:
class Bridge {
public:
IfFrameSender *pFrmSender;
std::string senderName;
...
Bridge(cfg_settings cfg_sett);
void saveFrame(cv::Mat &cvFrm, uint XOff, uint YOff);
...
}
特别是pFrmSender是指向虚拟类IfFrameSender的指针。
在Bridge.cpp中,我定义了构造函数:
Bridge::Bridge(cfg_settings cfg_sett)
{
...
/* Instantiates a sender_by_socket object using a factory */
IfFrameSender *pFrmSender = FrameSenderFactory::Get()->CreateFrameSender("FrameSenderBySocket");
...
}
和方法:
void Bridge::saveFrame(cv::Mat &cvFrm, uint XOff, uint YOff)
{
...
pFrmSender->sendFrame(...);
...
}
好吧,当我尝试调用pFrmSender时,我遇到了一个seg错误。我做了一些调试,我发现在Bridge :: saveFrame方法中,该成员的内存地址不正确(CCCCCCCC),而在构造函数中,它已正确实现,我&#39 ; ve打印了它的内存地址,似乎是一致的。
我已经在头文件中声明了该成员,所以我认为它可以通过Bridge类的任何方法显示。我哪里错了?
提前致谢。
答案 0 :(得分:1)
问题是:
Bridge::Bridge(cfg_settings cfg_sett)
{
/* Following is a temporary variable, which is destroyed after this ctor returns */
IfFrameSender *pFrmSender = FrameSenderFactory::Get()->CreateFrameSender("FrameSenderBySocket");
}
您正在构造函数中创建一个新的(临时)IfFrameSender *
,一旦构造函数返回,它将被销毁。而是初始化声明为类成员的那个:
Bridge::Bridge(cfg_settings cfg_sett)
{
this->pFrmSender = FrameSenderFactory::Get()->CreateFrameSender("FrameSenderBySocket");
}
最好在使用指针时检查null
:
void Bridge::saveFrame(cv::Mat &cvFrm, uint XOff, uint YOff){
if(pFrmSender!=nullptr)
pFrmSender->sendFrame(...);
}
虽然,我想在这种情况下,如果无法构造pFrmSender
,那么Bridge::Bridge()
如果创建本身毫无意义,则可能会抛出异常。
答案 1 :(得分:0)
试试这个:
Bridge::Bridge(cfg_settings cfg_sett) :
pFrmSender(FrameSenderFactory::Get()->CreateFrameSender("FrameSenderBySocket"))
{
}
这样你实际上是在初始化你的班级成员。