Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 实现C++;字符数组包装类中的setter?_C++_Operator Overloading_Setter - Fatal编程技术网

C++ 实现C++;字符数组包装类中的setter?

C++ 实现C++;字符数组包装类中的setter?,c++,operator-overloading,setter,C++,Operator Overloading,Setter,我正在处理一个只包含字符数组及其大小(长度以字节为单位)的类。目前,我想重载这个类的“+”操作数(以实现级联)。施工人员工作良好。对象被创建,我可以在调试器中看到它们的字段和值。我被困在使用“+”的地方(主线(第13行))。代码编译得很好,甚至没有警告,但当我运行它时,我的程序失败,出现“无效指针消息”。我找到了无效指针的确切位置。它在“+”实现中(BufferArray.cpp,第39行)。当我调用SetBuffer时,char数组被正确分配(我在操作符实现范围中看到它的值'qwasd',但在

我正在处理一个只包含字符数组及其大小(长度以字节为单位)的类。目前,我想重载这个类的“+”操作数(以实现级联)。施工人员工作良好。对象被创建,我可以在调试器中看到它们的字段和值。我被困在使用“+”的地方(主线(第13行))。代码编译得很好,甚至没有警告,但当我运行它时,我的程序失败,出现“无效指针消息”。我找到了无效指针的确切位置。它在“+”实现中(BufferArray.cpp,第39行)。当我调用SetBuffer时,char数组被正确分配(我在操作符实现范围中看到它的值'qwasd',但在下一行调用SetSize时,它消失了。我不知道为什么

我的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 */
#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。