你好,我有一个pump类,它需要使用一个成员变量,该变量是指向包含端口地址"com9“的wchar_t数组的指针。
问题是,当我在构造函数中初始化这个变量时,我的编译器会标记出一个折旧转换警告。
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;
}
发布于 2010-09-23 22:27:47
如果portNumber
是一个wchar_t*
,那么它应该是一个const wchar_t*
。
字符串文字是不可变的,因此元素是const
。有一个不推荐使用的从字符串到非常数指针的转换,但这很危险。进行更改,以便保持类型安全,并且不使用不安全的转换。
第二个失败是因为你指向了一个局部变量的内容。当构造函数结束时,变量就消失了,你指向了一个无效的位置。使用它会导致未定义的行为。
最后,使用初始化列表:
pump::pump() :
portNumber(L"com9")
{}
初始化列表是初始化,构造函数是完成构造。(而且,对于几乎所有的C++用户来说,this->
都很难看;它既不友好也不多余。)
发布于 2010-09-23 22:28:21
使用const wchar_t*
指向文字。
转换存在的原因是,从C的早期版本开始,将字符串字面值分配给非常数指针*是有效的。它被弃用的原因是修改文字是无效的,并且使用非常量指针来引用不能修改的内容是有风险的。
*C最初没有const
。当添加const
时,显然它应该应用于字符串文字,但是在const
出现之前就已经有了编写的代码,如果你突然不得不到处散布const
,这些代码就会崩溃。今天,我们仍在为语言的突破性变化付出代价。因为您使用的是C++,所以它甚至不是这种语言的突破性变化。
发布于 2010-09-23 22:29:14
显然,portNumber
是一个wchar_t *
(非常量),对吗?如果是这样的话:
到非常数char
s/wchar_t
s的丑陋的隐式转换被批准,IIRC,以实现与const
还不存在时编写的旧代码的兼容性;可悲的是,它让许多不知道常量正确性是什么意思的笨蛋编写了要求非常数指针的代码,即使常量指针是正确的选择。
portNumber
指向堆栈上分配的变量,当构造函数返回时,该变量会被删除。构造函数返回后,存储在portNumber
中的指针指向随机垃圾。正确的方法是在不需要修改的情况下将portNumber
声明为const wchar_t *
。相反,如果在类的生命周期中确实需要修改它,通常最好的方法是完全避免C样式的字符串,只抛出一个std::wstring
,它将负责与字符串相关的所有记账工作。
https://stackoverflow.com/questions/3779350
复制相似问题