C++ 实现C++;字符数组包装类中的setter?
我正在处理一个只包含字符数组及其大小(长度以字节为单位)的类。目前,我想重载这个类的“+”操作数(以实现级联)。施工人员工作良好。对象被创建,我可以在调试器中看到它们的字段和值。我被困在使用“+”的地方(主线(第13行))。代码编译得很好,甚至没有警告,但当我运行它时,我的程序失败,出现“无效指针消息”。我找到了无效指针的确切位置。它在“+”实现中(BufferArray.cpp,第39行)。当我调用SetBuffer时,char数组被正确分配(我在操作符实现范围中看到它的值'qwasd',但在下一行调用SetSize时,它消失了。我不知道为什么 我的setter有什么问题,在这种情况下如何实现“+”操作数 提前谢谢 以下是我使用的代码: BufferArray.h:C++ 实现C++;字符数组包装类中的setter?,c++,operator-overloading,setter,C++,Operator Overloading,Setter,我正在处理一个只包含字符数组及其大小(长度以字节为单位)的类。目前,我想重载这个类的“+”操作数(以实现级联)。施工人员工作良好。对象被创建,我可以在调试器中看到它们的字段和值。我被困在使用“+”的地方(主线(第13行))。代码编译得很好,甚至没有警告,但当我运行它时,我的程序失败,出现“无效指针消息”。我找到了无效指针的确切位置。它在“+”实现中(BufferArray.cpp,第39行)。当我调用SetBuffer时,char数组被正确分配(我在操作符实现范围中看到它的值'qwasd',但在
#include <string.h>
#include <stdio.h>
#ifndef BUFFERARRAY_H
#define BUFFERARRAY_H
class BufferArray {
public:
BufferArray(char* reservedPlace);
BufferArray();
void SetSize(int sz);
int GetSize();
void SetBuffer(char* buf);
char* GetBuffer();
BufferArray operator+ (BufferArray bArr) const;
virtual ~BufferArray();
private:
int size;
char *buffer;
};
#endif /* BUFFERARRAY_H */
#include "BufferArray.h"
// Constructors.
BufferArray::BufferArray(){
size = 0;
strcpy(buffer, "");
}
BufferArray::BufferArray(char* reservedPlace) {
size = strlen(reservedPlace);
buffer = reservedPlace;
}
// Getters and setters.
void BufferArray::SetSize(int sz)
{
size = sz;
}
int BufferArray::GetSize()
{
return size;
}
void BufferArray::SetBuffer(char* buf)
{
buffer = buf;
}
char* BufferArray::GetBuffer()
{
return buffer;
}
// Operator +.
BufferArray BufferArray::operator+ (BufferArray bArr) const
{
char tempCharArray[strlen(buffer) + strlen(bArr.GetBuffer())];
strcpy(tempCharArray, buffer);
strcat(tempCharArray, bArr.GetBuffer());
BufferArray tempBA;
tempBA.SetBuffer(tempCharArray);
tempBA.SetSize(strlen(bArr.GetBuffer()) + strlen(buffer)); // Vanishes buffer field.
printf("%d",tempBA.GetSize());
return tempBA;
}
// Destructor.
BufferArray::~BufferArray() {
// Destroy the pointer.
delete [] buffer;
}
以及主功能:
#include <cstdlib>
#include <iostream>
#include "BufferArray.h"
using namespace std;
int main(int argc, char** argv) {
BufferArray ba1;
char tmp1[3] = "qw";
char tmp2[4] = "asd";
ba1.SetSize(strlen(tmp1));
ba1.SetBuffer(tmp1);
BufferArray ba2(tmp2);
BufferArray ba3 = ba1 + ba2; // Runtime error is here.
cout << ba3.GetBuffer() << endl;
return 0;
}
#包括
#包括
#包括“BufferArray.h”
使用名称空间std;
int main(int argc,字符**argv){
缓冲阵列ba1;
字符tmp1[3]=“qw”;
char tmp2[4]=“asd”;
ba1.设置大小(strlen(tmp1));
ba1.SetBuffer(tmp1);
缓冲阵列ba2(tmp2);
BufferArray ba3=ba1+ba2;//此处有运行时错误。
cout您需要使用new
来创建这些字符数组,否则当您退出作用域时,临时数组(如tempBA)将被销毁
void BufferArray::SetBuffer(char* buf)
{
buffer = new char[strlen(buf)+1]; //edit, my size param wasn't necessary
strcpy(buffer,buf);
}
在BufferArray::operator+中,tempCharArray是一个临时缓冲区,在函数完成时将被销毁。基本上有两种处理方法:
1/在operator+中使用new[]分配临时缓冲区,这样可以确保缓冲区在调用operator+后仍然有效,但可能会出现内存泄漏或要求调用方稍后调用delete[],这非常笨拙且容易出错
2/或者更好的方法是,修改setBuffer,使其生成缓冲区的内部副本,并在您自己的析构函数中添加对delete[]的调用:
BufferArray::~BufferArray() {
delete[] buffer;
}
void BufferArray::setBuffer(char *otherBuffer) {
buffer = new char[strlen(otherBuffer) + 1];
strcpy(buffer, otherBuffer);
}
请注意,您必须修改构造函数,以便它也复制输入缓冲区(否则,当对象被销毁时,您将非法调用delete[]),然后您可能希望重载复制构造函数和赋值运算符,以防止浅复制,这将导致双重删除缓冲区
在实际的生产代码中,您可能希望使用某种类型的托管指针来避免自己执行删除操作(例如std::vector或boost::shared_数组),但对于家庭作业,上述解决方案应该可以
另一方面,在使用strlen确定缓冲区大小时,请不要忘记添加+1;)我试图观察当“buf”作为输入参数传递时strlen(buf)返回的内容,发现它工作正常(返回5)。谢谢你的回答!我正在尝试修复我的类。我会在它工作后接受正确的答案。它工作了!除了更改setter和构造函数代码(其中使用了“new”关键字来创建字符数组),我还必须动态分配BufferArray tempBA,如下所示:BufferArray*tempBA=new BufferArray(tempCharArray);然后我返回*tempBA,而不是tempBA。