通过默认初始化+赋值运算符显式调用类构造函数来使用对象

时间:2016-07-27 23:33:39

标签: c++ function pointers wxwidgets

考虑以下示例:

#include <wx/bitmap.h>

int main()
{
    wxBMPHandler h;

    wxImage::AddHandler(&h);

    wxBitmap bm = wxBitmap(200, 200);
    bm.SaveFile("file.bmp", wxBITMAP_TYPE_BMP);

    return 0;
}

因为我只使用h来调用AddHandler()而不是其他任何内容,所以我想避免完全定义它并将整个事情放在一行中。所以我想用以下方法取代它:

wxImage::AddHandler(&wxBMPHandler());
编译好的

,但调用SaveFile()将不起作用; WxWidgets将在运行时显示错误,指出“未定义类型1的图像处理程序”。

我猜在函数调用中创建的对象是临时的,但我不确定。如果没有,我错过了什么,以及如何避免定义h

值得注意的是AddHandler()具有以下签名:

static void AddHandler( wxImageHandler *handler );


[更新] 回应M.M的评论说:

  

wxImage ::的AddHandler(安培; wxBMPHandler());应该无法编译,除非   该类已经超载了运算符&amp;对于右撇子

因为我找不到运营商和运营商的定义。在WxWidgets的源代码中,我创建了这个测试项目:

#include <iostream>
#include <string>

using namespace std;

string* address = nullptr;

void testing(string* input)
{
    *input = "Something else entirely";
    address = input;
}

int main()
{
    testing(&string("Life is a test"));

    cout << *address << endl;

    cin.get();
    return 0;
}

它编译得很好,没有任何“硬错误”运行 - 唯一需要注意的是屏幕上没有显示任何内容 - (*address).empty()返回true。 我甚至定义了我自己的类来测试,而不是std::string并产生相同的行为(没有编译器错误,没有运行时错误,但没有输出)。

我也按照aichao的建议尝试了这种单行程,但没有成功:

wxImage::AddHandler(shared_ptr<wxBMPHandler>(new wxBMPHandler()).get());

2 个答案:

答案 0 :(得分:3)

我之前从未使用wxWidgets,但根据wxWidgets version 3.1.1 API docs here,您应该使用堆分配的处理程序对象调用wxImage::AddHandler

wxImage::AddHandler(new wxBMPHandler);

因此,无需定义h。同样根据文档,此处理程序对象的内存由wxWidgets框架管理。具体来说,文档说handler

  

堆分配的处理程序对象,如果稍后由wxImage删除或在程序关闭时将被RemoveHandler()删除。

还有静态成员函数wxImage::CleanUpHandlers()来删除所有已注册的图像处理程序。根据文件:

  

此功能在退出时由wxWidgets调用。

因此,您不必自己删除处理程序,除非您特别想要(即释放一些内存)。

希望这有帮助。

答案 1 :(得分:1)

wxImage::AddHandler(&wxBMPHandler());中,表达式结尾的临时停止的生命周期,因此你有悬空指针。

wxBMPHandler h;

wxImage::AddHandler(&h);

wxBitmap bm = wxBitmap(200, 200);
bm.SaveFile("file.bmp", wxBITMAP_TYPE_BMP);

h超过了电话bm.SaveFile("file.bmp", wxBITMAP_TYPE_BMP);

您将遇到与

类似的问题
{
    wxBMPHandler h;

    wxImage::AddHandler(&h);
} // End of life time of h

wxBitmap bm = wxBitmap(200, 200);
bm.SaveFile("file.bmp", wxBITMAP_TYPE_BMP);