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

Using an object by calling class constructor explicitly vs by default initialization + assignment operator

本文关键字:赋值运算符 初始化 对象 默认 调用 构造函数      更新时间:2023-10-16

考虑以下示例:

#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());应编译失败,除非该类具有重载运算符&对于价值

由于我找不到运算符&在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,并产生了相同的行为(没有编译器错误,没有运行时错误,但没有输出)。

我也试过这一条班轮,正如爱巢所建议的,但没有成功:

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

我以前从未使用过wxWidgets,但根据这里的wxWidgets 3.1.1版API文档,您应该使用堆分配的处理程序对象调用wxImage::AddHandler

wxImage::AddHandler(new wxBMPHandler);

因此,没有必要定义h。此外,根据文档,该处理程序对象的内存由wxWidgets框架管理。具体来说,文档中说handler

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

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

此函数由wxWidgets在退出时调用。

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

希望这能有所帮助。

wxImage::AddHandler(&wxBMPHandler());中,临时停止的生存期在表达式的末尾,因此您有悬空指针。

在中

wxBMPHandler h;
wxImage::AddHandler(&h);
wxBitmap bm = wxBitmap(200, 200);
bm.SaveFile("file.bmp", wxBITMAP_TYPE_BMP);

CCD_ 17比呼叫CCD_。

也会有类似的问题

{
    wxBMPHandler h;
    wxImage::AddHandler(&h);
} // End of life time of h
wxBitmap bm = wxBitmap(200, 200);
bm.SaveFile("file.bmp", wxBITMAP_TYPE_BMP);