首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分配和添加操作符重载(连接2个表和int)

分配和添加操作符重载(连接2个表和int)
EN

Stack Overflow用户
提问于 2019-11-11 13:01:25
回答 1查看 87关注 0票数 1

我正在尝试连接两个数组,并在最后连接int,例如:结果= arg + arg + 2;在+操作符重载时,我得到了“读取访问违规”。我在下面的评论中写了错误和警告。

我的代码:

Main:

代码语言:javascript
复制
#include <iostream>
#include <string>
#include "CTable.h"
int main() {

    CTable c_tab1, c_tab0;
    c_tab0.SetNewSize(3);
    c_tab1.SetNewSize(2);

    c_tab0.SetValueAt(0, 22);
    c_tab0.SetValueAt(1, 23);
    c_tab0.SetValueAt(2, 24);
    c_tab0.Print();

    c_tab1.SetValueAt(0, 31);
    c_tab1.SetValueAt(1, 32);
    c_tab1.Print();

    CTable c_tab3 = (c_tab0 + c_tab1 + 111);
    c_tab3.Print();

    return 0;
}

CTable类:

代码语言:javascript
复制
#include <iostream>
#include <string>

using namespace std;

class CTable {

public:
    CTable();
    CTable(string sName, int iTableLen);
    CTable(const CTable& pcOther);
    CTable* pcClone();
    ~CTable();

    void ShowName();
    void ShowSize();
    void SetName(string sName);
    bool SetNewSize(int iTableLen);
    void SetValueAt(int iOffset, int iNewVal);
    void Print();
    CTable& operator+(const CTable& pcNewTable);
    CTable operator+(int iNewVal) const;
    CTable& operator=(const CTable& pcNewVal) {
        if (this != &pcNewVal) {
        for (int i = 0; i < i_size; i++) {
            this->piTable[i] = pcNewVal.piTable[i];
        }
    }
        return *this;
    }

private:
    string s_name;
    int i_size;
    int* piTable;

    const int SIZE = 10;
    const string NAME = "Name";
};
代码语言:javascript
复制
#include <iostream>
#include <string>
#include "CTable.h"
#include <algorithm>

using namespace std;

CTable::CTable() {
    s_name = NAME;
    cout << "bezp: " << s_name << endl;
    piTable = new int[SIZE];
    i_size = SIZE;
}

CTable::CTable(string sName, int iTableLen) {
    s_name = sName;
    cout << "parametr: " << sName << endl;
    piTable = new int[iTableLen];
    i_size = iTableLen;
}

CTable::CTable(const CTable& pcOther) {
    s_name = pcOther.s_name + "copied";
    piTable = new int[pcOther.i_size];
    i_size = pcOther.i_size;
    for (int i = 0; i < pcOther.i_size; i++) { 
        piTable[i] = pcOther.piTable[i];
    }
}

CTable::~CTable() {
    delete[] piTable;
}

void CTable::SetName(string sName) {

    s_name = sName;
}

bool CTable::SetNewSize(int iTableLen) {

    if (iTableLen <= 0) {
        cout << "Length has to be greater than 0" << endl;
        return false;
    }

    int* pi_newTable = new int[iTableLen];
    for (int i = 0; i < iTableLen; i++) {
        pi_newTable[i] = piTable[i];
    }
    delete this->piTable;
    this->i_size = iTableLen;
    this->piTable = pi_newTable;

    return true;
}

CTable* CTable::pcClone() {
    CTable* ct = new CTable(s_name, i_size); 
    return ct;
}

void CTable::ShowName() {
    cout << "Name: " << s_name << endl;
}

void CTable::ShowSize() {
    cout << "Size: " << i_size << endl;
}

void CTable::SetValueAt(int iOffset, int iNewVal) {
    if (iOffset >= this->i_size) {
        return;
    }
    piTable[iOffset] = iNewVal;
}

void CTable::Print() {
    for (int i = 0; i < i_size; i++) {
        cout << piTable[i] << " ";
    }
    cout << endl;
}

CTable& CTable::operator+(const CTable& pcNewTable) {
    CTable result("new_int", this->i_size);

    result.i_size = (i_size + pcNewTable.i_size);
    result.piTable = new int[i_size + pcNewTable.i_size];

    for (int i = 0; i < i_size; i++) {
        result.piTable[i] = piTable[i];
    }

    for (int i = 0; i < (pcNewTable.i_size); i++) {
        result.piTable[i+i_size] = pcNewTable.piTable[i];
    }
    return result; //Warning C4172 returning address of local variable or temporary: result
}

CTable CTable::operator+(int iNewVal) const {
    CTable result("new_int", this->i_size);
    result.i_size = (i_size + 1);
    result.piTable = new int[i_size + 1];

    for (int i = 0; i < i_size; i++) {
        result.piTable[i] = piTable[i]; //Exception thrown: read access violation. **this->piTable** was 0x1110122.
    }
    result.piTable[i_size + 1] = iNewVal;
    return result;
}

我该纠正什么?我不确定接线员是不是过载了,可以吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-11 13:34:53

成员函数SetNewSize具有未定义的行为。在这个循环中

代码语言:javascript
复制
int* pi_newTable = new int[iTableLen];
for (int i = 0; i < iTableLen; i++) {
    pi_newTable[i] = piTable[i];
}

它( 1)使用未初始化的值,因为数组没有初始化;2) iTableLen可以比i_size的当前值更小。至少应该零初始化构造函数中的数组。

复制赋值操作符aslo具有未定义的行为,因为对象pcNewVal的数组的元素数可以小于指定对象中数组的元素数。

第一个重载的operator +也有未定义的行为。首先,如警告所述,运算符返回对本地对象结果的引用,该结果在退出运算符后将不活动。其次,存在内存泄漏,因为对象的数组被重新分配,构造函数中先前分配的内存没有被释放。

代码语言:javascript
复制
CTable result("new_int", this->i_size);

result.i_size = (i_size + pcNewTable.i_size);
result.piTable = new int[i_size + pcNewTable.i_size];
//...

第二个重载的operator +也有未定义的行为。与前面的操作符一样,存在内存泄漏。

在本声明中

代码语言:javascript
复制
result.piTable[i_size + 1] = iNewVal;

在分配的数组之外有一个访问内存。应该有

代码语言:javascript
复制
result.piTable[i_size] = iNewVal;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58801913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档