C++中类成员的动态分配



我正在尝试用C++学习POO。我有一个关于分类中的内存分配的问题。我想创建一个堆栈类。我用C++编写了这段代码:

这是堆栈类:

class Stack {
private:
int *stackArray;
int topLevel;
public:
// Constructor without par
Stack() {
stackArray = new int[NMAX];
topLevel = -1; // stiva este NULL la inceput
}
Stack(int array_size) {
stackArray = new int[array_size];
topLevel = - 1;
}
~Stack() {
delete[] stackArray;
}
void push(int x) {
int n_maxim = sizeof(stackArray) / sizeof(int);
if (topLevel >= n_maxim - 1) {
cout << "The stack is full !n";
return;
}
topLevel++;
stackArray[topLevel] = x;
}
};

这是主要功能:

int main() {
int n;
cout << "Introduceti numarul de elemente =";
cin >> n;
Stack *s = new Stack();
s->push(6);
s->push(10);
return 0;
}

所以我的问题是内存分配不起作用,它不会使大小为 NMAX(100( 或大小为 n 的"v"数组从键盘读取。所以 push 函数仅适用于 1 个元素,因为我不知道为什么,在任何分配内存之后的 sizeof(v( 都是 4。

您不能将sizeof()与动态分配的数组一起使用,它将返回int*指针本身的大小,而不是它指向的数组的大小。 因此,您的类必须跟踪数组大小。

此外,您的类未实现 3/5/0 规则。 您需要添加复制构造函数和复制赋值运算符,以便可以正确复制数组。

试试这个:

#include <algorithm>
class Stack {
private:
int *stackArray;
int arraySize;
int topLevel;
public:
Stack(int array_size = NMAX) {
stackArray = new int[array_size];
arraySize = array_size;
topLevel = -1;
}
Stack(const Stack &src) {
stackArray = new int[src.arraySize];
arraySize = src.arraySize;
for (int i = 0; i < arraySize; ++i)
stackArray[i] = src.stackArray[i];
topLevel = src.topLevel;
}
~Stack() {
delete[] stackArray;
}
Stack& operator=(const Stack &rhs) {
if (&rhs != this) {
Stack temp(rhs);
std::swap(stackArray, temp.stackArray);
std::swap(arraySize, temp.arraySize);
std::swap(topLevel, temp.topLevel);
}
return *this;
}
void push(int x) {
if (topLevel >= (arraySize-1)) {
cout << "The stack is full !n";
return;
}
topLevel++;
stackArray[topLevel] = x;
}
};

你找不到像这样的堆栈大小:

int n_maxim = sizeof(stackArray) / sizeof(int);

因为这只是指针除以sizeofintsizeof,那可能是1.

你想要这样的东西:

class Stack {
private:
int *stackArray;
int topLevel;
int n_maxim;
public:
// Constructor without par
Stack() {
stackArray = new int[NMAX];
topLevel = -1; // stiva este NULL la inceput
n_maxim = NMAX;
}
Stack(int array_size) {
stackArray = new int[array_size];
topLevel = - 1;
n_maxim = array_size;
}
...

最新更新