为什么我的对象在 C++ 中被覆盖?
Why does my object get overwritten in C++?
我正在尝试创建对象指针网格。
为此,我做了两个 classes,第一个叫做 Pixel,存储像素的信息,第二个是 Grid class,它的构造函数创建了一个矩阵指向 Pixel 对象的指针。
当我实例化像素对象和网格对象时出现问题,像素对象被覆盖。
#include <iostream>
#include <vector>
class Pixel{
private:
char cel_type;
public:
Pixel(void){cel_type = 'O';};
Pixel(char _type){cel_type = _type;};
char getType(){return cel_type;}
~Pixel(){};
};
class Grid{
private:
int rows, cols;
Pixel g[0][0], *p[0][0];
public:
Grid(int, int); //create the grid
};
Grid::Grid(int M, int N){
Pixel p0('C'), *pt;
rows = M;
cols = N;
for (int i = 0; i < cols; i++) {
for (int j = 0; j < rows; j++) {
g[i][j] = p0; // THE PROBLEM ?
p[i][j] = &p0;
};
};
};
int main(){
int M = 3, N = 4;
Pixel p1('A'), p2('B');
std::cout<<"Before: "<<p1.getType()<<p2.getType()<<std::endl;
Grid g(M,N);
std::cout<<"After: "<<p1.getType()<<p2.getType()<<std::endl;
};
这应该打印:
- 之前:AB
- 之后:AB
但是,它给出了:
- 之前:AB
- 之后:C
为什么 p1 和 p2 会被覆盖?
在Grid构造函数中,p0是局部变量。它在构造函数结束时消失。 &p0 是局部变量的地址。当构造函数结束时,它指向随机垃圾。因此,无论您存储到 p 中的是什么,都是垃圾指针。
但情况更糟。您将 g 和 p 声明为大小为 0 的数组。(为什么您的编译器甚至允许这样做?)因此,当您初始化 Grid 时,它会存储大量像素和指针,天知道在哪里。
我正在尝试创建对象指针网格。
为此,我做了两个 classes,第一个叫做 Pixel,存储像素的信息,第二个是 Grid class,它的构造函数创建了一个矩阵指向 Pixel 对象的指针。
当我实例化像素对象和网格对象时出现问题,像素对象被覆盖。
#include <iostream>
#include <vector>
class Pixel{
private:
char cel_type;
public:
Pixel(void){cel_type = 'O';};
Pixel(char _type){cel_type = _type;};
char getType(){return cel_type;}
~Pixel(){};
};
class Grid{
private:
int rows, cols;
Pixel g[0][0], *p[0][0];
public:
Grid(int, int); //create the grid
};
Grid::Grid(int M, int N){
Pixel p0('C'), *pt;
rows = M;
cols = N;
for (int i = 0; i < cols; i++) {
for (int j = 0; j < rows; j++) {
g[i][j] = p0; // THE PROBLEM ?
p[i][j] = &p0;
};
};
};
int main(){
int M = 3, N = 4;
Pixel p1('A'), p2('B');
std::cout<<"Before: "<<p1.getType()<<p2.getType()<<std::endl;
Grid g(M,N);
std::cout<<"After: "<<p1.getType()<<p2.getType()<<std::endl;
};
这应该打印:
- 之前:AB
- 之后:AB
但是,它给出了:
- 之前:AB
- 之后:C
为什么 p1 和 p2 会被覆盖?
在Grid构造函数中,p0是局部变量。它在构造函数结束时消失。 &p0 是局部变量的地址。当构造函数结束时,它指向随机垃圾。因此,无论您存储到 p 中的是什么,都是垃圾指针。
但情况更糟。您将 g 和 p 声明为大小为 0 的数组。(为什么您的编译器甚至允许这样做?)因此,当您初始化 Grid 时,它会存储大量像素和指针,天知道在哪里。