你好我有一个泵类需要使用一个成员变量,该变量是一个指向包含端口地址的wchar_t数组的指针,即:“com9”。
问题在于,当我在构造函数中初始化此变量时,我的编译器会标记折旧的转换警告。
pump::pump(){
this->portNumber = L"com9";}
这很好用,但每次编译时都会发出警告,这让我觉得我做错了。
我尝试创建一个数组,然后像这样设置成员变量:
pump::pump(){
wchar_t port[] = L"com9";
this->portNumber = port;}
但由于某种原因,这使我的portNumber指向'F'。
显然,我的另一个概念问题。
感谢您帮助解决我的无聊问题。
编辑:
作为请求,portNumber的定义是:
class pump
{
private:
wchar_t* portNumber;
}
感谢答案,现在已改为:
class pump
{
private:
const wchar_t* portNumber;
}
答案 0 :(得分:12)
如果portNumber
是wchar_t*
,则应为const wchar_t*
。
字符串文字是不可变的,因此元素是const
。存在从字符串文字到非常量指针的不推荐的转换,但这是危险的。进行更改,以确保类型安全,不使用不安全的转换。
第二个失败是因为您指向局部变量的内容。当构造函数完成时,变量消失,你指向一个无效的位置。使用它会导致未定义的行为。
最后,使用初始化列表:
pump::pump() :
portNumber(L"com9")
{}
初始化列表是初始化,构造函数是完成构造。 (另外,对于几乎所有C ++人来说,this->
都是丑陋的;它并不好看和多余。)
答案 1 :(得分:2)
使用const wchar_t*
指向文字。
转换存在的原因是因为它从C的早期版本开始有效,将字符串文字分配给非常量指针[*]。它被弃用的原因是修改文字是无效的,使用非常量指针来引用一些不能修改的东西是有风险的。
[*] C最初没有const
。添加const
后,显然它应该适用于字符串文字,但是已经存在代码,在const
存在之前写入,如果突然你不得不在任何地方撒上const
那么会破坏。我们今天仍在为这种语言的突破性变化付出代价。因为它是你正在使用的C ++,所以它甚至不是对这种语言的重大改变。
答案 2 :(得分:1)
显然,portNumber
是wchar_t *
(非常),对吗?如果是这样的话:
第一个是错误的,因为字符串文字是只读的(它们是指向存储在可执行文件的字符串表中的char 通常数组的常量指针,它映射到记忆在某个地方,通常是在一个只读页面。)
对于非const char
s / wchar_t
的丑陋,隐式转换已获得批准,IIRC,以实现与const
甚至不存在时编写的旧代码的兼容性;遗憾的是,它让许多不知道 const正确性的蠢货意味着要编写代码,即使const指针是正确的选择,也要求非常量指针。
第二个是错误的,因为你使portNumber
指向堆栈上分配的变量,当构造函数返回时,该变量将被删除。构造函数返回后,存储在portNumber
中的指针指向随机垃圾。
正确的方法是将portNumber
声明为const wchar_t *
,如果不需要修改的话。相反,如果 需要在类的生命周期内进行修改,通常最好的方法是避免使用C风格的字符串,只需要输入std::wstring
,处理与字符串相关的所有簿记。