通过显式调用类构造函数与默认初始化+赋值运算符来使用对象
Using an object by calling class constructor explicitly vs by default initialization + assignment operator
考虑以下示例:
#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);
- 为什么初始化时没有调用重载赋值运算符?
- 由于没有使用赋值运算符,映射的值是如何初始化的?
- 在未初始化的变量上使用复合赋值运算符(+=, ..)不是C++中的UB?
- 复制 CTOR 与赋值运算符以初始化对象(性能)
- 为什么我可以在不使用赋值运算符的情况下使用列表初始化普通数组
- Clang 无法在赋值运算符/复制构造函数中检测到未初始化的类成员
- 为什么参数可以在对象初始化时通过赋值运算符传递给构造函数?
- 为什么我需要在用户为其赋值之前初始化此变量
- 初始化对象后,用隐式转换而不是赋值运算符调用构造函数有什么意义
- 初始化对象后,如何使用赋值运算符覆盖C++中的类对象
- 初始化对象时复制构造函数/赋值运算符混淆
- 'for' 循环中的 'int i = 0' vs. 'int i(0)'(赋值与初始化计数变量)
- 类内成员初始化是否删除赋值运算符
- 从初始化构造函数和赋值运算符创建的对象有什么区别
- C++类变量:初始化与向量的赋值和初始化
- C++11:赋值运算符是否阻止一个类型成为POD,从而全局初始化
- 赋值运算符和初始化
- 在c++中如何从另一个字符串赋值未初始化的字符串值
- 声明、定义、赋值、初始化变量
- 当一个对象在复制构造函数或赋值运算符中未初始化时会发生什么