C++控制台应用程序 1.exe 已触发断点



当我尝试设置

cub.SetArray(cube);

我收到错误

Console Application1.exe has triggered a breakpoint 

我做错了什么?当我尝试调试cub -> cubesarray时,我得到的大小 -842150451。我不明白为什么。这是我的所有代码

class Cube{
public:
    static const int Change_ARRAY = 5;
private:
    string color;
    int size;
    int *walls;
    int n; // current size of array
    int maximumsize; // maximum size of array
    void Increase(int many);
public:
    Cube(int maximumsize = 0);
    ~Cube();
    void SetWalls(int wall);
    void SetColor(string color);
    void SetSize(int size);
    string GetColor(){return color;}
    int GetWalls(int i){return walls[i];}
    int GetSize(){return size;}
    int GetN(){return n;}
};
Cube::Cube(int maximumsize):n(0), maximumsize(maximumsize), size(size), walls(NULL){
    if(maximumsize > 0){
        walls = new int[maximumsize];
    }
}
Cube::~Cube(){
    if(walls){
        delete [] walls;
    }
}
void Cube::Increase(int many){
    if(many > maximumsize){
        int *newest = new int[many];
        for(int i=0; i<n; i++)
            newest[i] = walls[i];
        delete [] walls;
        walls = newest;
        maximumsize = many;
    }else if( many < maximumsize){
        int *newest = new int[many];
        for(int i=0; i<many; i++)
            newest[i] = walls[i];
        delete [] walls;
        walls = newest;
        n = maximumsize = many;
    }
}
void Cube::SetWalls(int wall){
    if(n == maximumsize) Increase(n + Change_ARRAY);
    walls[n] = wall;
    n++;
}
void Cube::SetColor(string color){
    this->color = color;
}
void Cube::SetSize(int size){
    this->size = size;
}
class CubesArray{
public:
    static const int Change_Array = 5;
private:
    Cube *cubesarray;
    int currentsize; // current size of array
    int maxsize; // maximumsize
    void Change (int kk);
public:
    CubesArray(int maxsize = 1);
    ~CubesArray();
    void SetArray(Cube c);
    Cube GetArray(int ind){return cubesarray[ind];}
    int GetCsize(){return currentsize;}
};
CubesArray::CubesArray(int maxsize):cubesarray(NULL), currentsize(0), maxsize(maxsize){
    if(maxsize > 0){
        cubesarray = new Cube[maxsize];
    }
}
CubesArray::~CubesArray(){
    if(cubesarray){
        delete [] cubesarray;
    }
}
void CubesArray::Change(int kk){
    if(kk > maxsize){
        Cube *newarr = new Cube[kk];
        for(int i=0; i<currentsize; i++)
            newarr[i] = cubesarray[i];
        delete [] cubesarray;
        cubesarray = newarr;
        maxsize = kk;
    }if(kk < maxsize){
        Cube *newarr = new Cube[kk];
        for(int i=0; i<kk; i++)
            newarr[i] = cubesarray[i];
        delete [] cubesarray;
        cubesarray = newarr;
        currentsize = maxsize = kk;
    }
}
void CubesArray::SetArray(Cube cub){
    if(currentsize = maxsize) Change(currentsize + Change_Array);
    cubesarray[currentsize] = cub;
    currentsize++;
}
void Read(CubesArray & cub);
int main(){
    CubesArray cub;
    Read(cub);
    system("pause");
    return 0;
}
void Read(CubesArray & cub){
    string color;
    int size;
    int i=0;
    Cube cube;
    ifstream fd(Data);
    while(!fd.eof()){
        fd >> color >> size;
        cube.SetSize(size);
        cube.SetColor(color);
        cout << cube.GetColor() << " " << cube.GetSize() << " ";
        while(fd.peek() != 'n' && !fd.eof()){
            int w;
            fd >> w;
            cube.SetWalls(w);
            cout << cube.GetWalls(i) << " ";
            cub.SetArray(cube); // when I set cube to cub I get this error!!!
            i++;
        }
        cout << endl;
        fd.ignore();
    }
}

更改:

if(currentsize = maxsize)

自:

if(currentsize == maxsize)

此外,这是您的真正问题:

你在class Cube中没有复制构造函数,所以每当你按值发送一个Cube实例时,walls数组都不会被正确复制,例如,cub.SetArray(cube)

您必须按如下方式定义它:

Cube::Cube(const Cube& cube):n(cube.n),maximumsize(cube.maximumsize),size(cube.size),wall(NULL)
{
    if (maximumsize > 0)
    {
        walls = new int[maximumsize];
        for (int i=0; i<maximumsize; i++)
            wall[i] = cube.wall[i];
    }
}

而且你在class Cube中没有赋值运算符,所以当你将一个Cube实例分配到另一个实例时,walls数组都不会被正确复制,例如,cubesarray[currentsize] = cub

您必须按如下方式定义它:

Cube& Cube::operator=(const Cube& cube)
{
    n = cube.n;
    maximumsize = cube.maximumsize;
    size = cube.size;
    wall = NULL;
    if (maximumsize > 0)
    {
        walls = new int[maximumsize];
        for (int i=0; i<maximumsize; i++)
            wall[i] = cube.wall[i];
    }
    return *this;
}

顺便说一句,在复制构造函数中,您可以简单地调用赋值运算符(删除编码冗余):

Cube::Cube(const Cube& cube)
{
    if (this != &cube)
        *this = cube;
}

您的立方体类违反了三规则。 看这里:

   void CubesArray::SetArray(Cube cub){  // calls copy constructor

该调用将创建多维数据集类的副本。 您的多维数据集类不可安全复制。 请参阅此内容并向下滚动到"管理资源"部分:什么是三法则?

您应该通过引用或常量引用传递多维数据集,而不是按值传递。 这样做可能会纠正您现在遇到的错误,但您的类仍然是错误的。

最新更新