gpt4 book ai didi

c++ - 指向对象数组的指针作为成员覆盖内存

转载 作者:太空宇宙 更新时间:2023-11-04 14:42:00 24 4
gpt4 key购买 nike

这是交易。我们有 2 个不同的类(class) F 级和 O 级

class F {
private:
int x;
int y;
public:
int getXf(){ return x; }
int getYf(){ return y; }
f(int ,int);
};

class O {
private:
int n;
int k;
int x;
int y;
char type;
int id;
int t;
public:
O(int ,int ,int ,int ,int);
int getX(){ return x; }
int getY(){ return y; }
};

我们有第三个类 P,我们在其中初始化值。在类中,我们创建了两个对象数组。

class Prog {                                                                   
public:
int count;
int fcount;
O *o[]; //here we are declaring the arrays of objects
F *f[];
public :
//void init(); Here is the function where we initializing the values
};

现在是我们创建对象的 2 个 for 语句。

for(int i=0;i<10;i++){
randx = rand() % 10;
randy = rand() % 20;

o[i] = new O(100,50,i,randx,randy);
}


for(int i=0;i<3;i++){
randx = rand() % 10;
randy = rand() % 10;

f[i] = new F(randx, randy);
}

当我们打印时,所有对象都在这里,但第一类的前 3 个被第二类的对象替换。恰好分别来自 randxrandy(第二个)的 10050(第一个)。

最佳答案

O *o[];

这声明了一个未知大小的数组,它是一个不完整的类型。 C++ 不允许将其用作类成员,尽管某些编译器允许将其作为扩展,将其解释为零大小的数组。无论哪种情况,都不是您想要的。

如果你知道在编译时绑定(bind)的数组,那么你应该指定它:

O *o[10];

否则,您将需要在运行时动态分配一个数组:

std::vector<O*> o;

for(int i=0;i<10;i++){
randx = rand() % 10;
randy = rand() % 20;

o.push_back(new O(100,50,i,randx,randy));
}

我还建议在数组中存储对象或可能的智能指针,而不是原始指针。如果您出于某种原因确实需要原始指针,那么请记住在完成后删除对象,因为这不会自动发生,并且不要忘记 Rule of Three .

关于c++ - 指向对象数组的指针作为成员覆盖内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14260334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com