在我的课堂上,除其他外,我还有一个指针:
Class GSM
{
//...
private:
char *Pin;
//...
}
我的构造函数将其初始化为:
GSM::GSM()
{
//...
Pin = NULL;
//...
}
现在,我想将默认值(" 1234")设置为我的PIN。我尝试了非常简单的方法:
bool GSM::setDefaultValue()
{
lock();
Pin = "0";
for (uint8 i =0; i < 4; ++i)
{
Pin[i] = i+1;
}
unlock();
return true;
}
但它没有用。当我运行我的程序(我使用Visual Studio 2010)时出现错误:
Access violation writing location 0x005011d8
我试图删除行
Pin = "0";
但它没有帮助。我必须在构造函数中将其初始化为NULL。它是一个更大的项目的一部分,但我认为,上面的代码是让我麻烦的原因。我在C ++ / OOP中仍然很新,有时我仍然会被指针弄糊涂。
我应该怎么做才能改进我的代码和我的想法? 编辑:根据要求,我必须补充说我不能使用std :: string。我是公司的实习生,项目很大(比如成千上万的文件),我在这里看不到任何标准,我也不允许使用它。
答案 0 :(得分:4)
你需要给Pin
一些记忆。像这样:
Pin = new char[5]; // To make space for terminating `\0`;
for(...)
{
Pin[i] = '0' + i + 1;
}
Pin[4] = '\0'; // End of the string so we can use it as a string.
...
然后你应该在某个地方使用delete [] Pin;
(通常在类的析构函数中,但是根据它的使用方式,它可能在别处需要,例如赋值运算符,你还需要写一个拷贝构造函数,参见Rule Of Three)。
在适当的C ++中,您应该使用std::string
代替,然后您可以执行:
Class GSM
{
//...
private:
std::string Pin;
....
Pin = "0000";
for (uint8 i =0; i < 4; ++i)
{
Pin[i] += i+1;
}
使用std::string
可以避免分配/解除分配内存的大部分问题,并且&#34;只是工作&#34;复制,分配或销毁类时 - 因为std::string
实现和编译器为您完成了工作。
答案 1 :(得分:1)
您需要分配一块内存来存储“1234”。您的Pin
指针将指向此内存块。
你可以尝试:
bool GSM::setDefaultValue()
{
lock();
Pin = new char[4];
for (uint8 i =0; i < 4; ++i)
{
Pin[i] = '0' + (i + 1);
}
unlock();
return true;
}
由于你已经为动态分配了一个内存块,所以当你不再需要它时,你应该总是释放它。为此,您应该在类中添加析构函数:
GSM::~GSM()
{
delete [] Pin;
}
答案 2 :(得分:0)
而不是使用堆(new
delete
),只需在类中为四个字符的引脚分配空间:
Class GSM
{
//...
private:
char Pin[5];
//...
}
长度固定为5(允许4个字符的空格并终止null
('\0'
),但只要您只需要存储最多4个字符,就可以了。
当然,如果您想在将来轻松改变:
Class GSM
{
//...
private:
const int pin_length = 4;
char Pin[pin_length+1];
//...
}
您设置值的功能将如下所示:
bool GSM::setDefaultValue()
{
lock();
for (char i = 0; i < pin_length; ++i)
{
Pin[i] = i+1;
}
Pin[pin_length]=0;
unlock();
return true;
}
甚至:
bool GSM::setDefaultValue()
{
lock();
strcpy(Pin,"1234"); //though you would have to change this if the pin-length changes.
unlock();
return true;
}