我正在研究只包含字符数组的类,它的大小(以字节为单位)。目前,我想为该类重载'+'操作数(以实现连接)。构造函数工作正常。对象被创建,我可以在调试器中看到它们的字段和值。我被困在使用'+'的地方(main(第13行))。代码编译得很好,甚至没有警告,但是当我运行它时,我的程序因“无效指针消息”失败。我发现那个无效指针在哪里。它在'+'实现中(BufferArray.cpp,第39行)。当我调用SetBuffer时,char数组被正确赋值(我在运算符实现范围中看到它的值为'qwasd'),但是在下一行时,它在我调用SetSize时消失。我不知道为什么。在char数组包装类中实现C++ setter的正确方法是什么?
我的setter有什么问题,在这种情况下如何实现'+'操作数?
在此先感谢。
这里是我一起工作的代码:
BufferArray.h:
#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 */
实施是在未来的文件BufferArray.cpp:
#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;
}
我试着看的时候,“BUF”作为传递什么样的strlen(BUF)返回一个输入参数,并发现它工作正常(它返回5)。感谢您的答案!我正在努力修复我的班级。在工作后我会接受适当的答案。 – 2011-05-22 10:02:31
它的工作原理!除了使用'new'关键字创建char数组的setter和构造函数代码的更改外,我还需要像这样动态分配BufferArray tempBA:BufferArray * tempBA = new BufferArray(tempCharArray);然后我返回* tempBA,而不是tempBA。 – 2011-05-22 19:12:25