当我尝试在c ++类中创建数组时,使用构造函数时出现了问题。这是代码:
int stacksize = 100;
int* buffer;
int stackpointer[3]= {-1, -1, -1};
public:
threestack(int stacksize_u)
{
int buffer_u[stacksize_u*3];
this->buffer = buffer_u;
this->stacksize = stacksize_u;
}
threestack()
{
int buffer_u[(this->stacksize)*3];
this->buffer = buffer_u;
}
这实际上不起作用。但是,当我在声明中创建数组时,它起作用了:
int stacksize = 100;
int buffer[300];
int stackpointer[3]= {-1, -1, -1};
当我使用构造函数时,有人可以告诉我出了什么问题吗?
PSS:这是全班和测试程序:
class threestack
{
int stacksize = 100;
int* buffer;
int stackpointer[3]= {-1, -1, -1};
public:
threestack(int stacksize_u)
{
int buffer_u[stacksize_u*3];
this->buffer = buffer_u;
this->stacksize = stacksize_u;
}
threestack()
{
int buffer_u[(this->stacksize)*3];
this->buffer = buffer_u;
}
bool push(int stacknum, int value);
bool pop(int stacknum);
int peek(int stacknum);
bool empty(int stacknum);
};
bool threestack::push(int stacknum, int value)
{
if(stackpointer[stacknum-1]+1 >= stacksize)
{
cout<<"Plz do not try to push to a full stack"<<endl;
// printf("stackpointer = %d\n", stackpointer[stacknum-1]);
return 0;
}
else
{
stackpointer[stacknum-1]++;
buffer[stackpointer[stacknum-1]+(stacknum-1)*stacksize] = value;
return 1;
}
}
int threestack::peek(int stacknum)
{
if(stackpointer[stacknum-1] < 0)
{
printf("No element in stack now.\n");
return 0;
}
else
{
printf("stackpointer = %d\n", stackpointer[stacknum-1]);
return buffer[stackpointer[stacknum-1]+(stacknum-1)*stacksize];
}
}
bool threestack::pop(int stacknum)
{
if(stackpointer[stacknum-1] < 0)
{
printf("Plz do not try to pop an empty stack.\n");
return 0;
}
else
{
stackpointer[stacknum-1]--;
}
return 1;
}
bool threestack::empty(int stacknum)
{
if(stackpointer[stacknum-1] < 0)
{
return true;
}
else
{
return false;
}
}
int main(int argc, const char * argv[])
{
threestack test;
test.push(1,5);
// test.pop(1);
// test.pop(1);
int i;
for(i=0; i<101; i++)
{
test.push(2, i);
printf("%d\n", test.peek(2));
}
cout<<endl;
printf("The top of stack 1 is %d\n", test.peek(1));
// std::cout << "Hello, World!\n";
return 0;
}
答案 0 :(得分:3)
C ++数组在编译时具有固定大小。
这就是您的测试模块工作的原因 - 在编译时已知大小(= 300)。
这是强制性的,因为数组的大小实际上是它的类型的一部分,这意味着
int[1]
的类型与int[2]
非常不同。
然而,当你在构造函数中“动态”创建数组时,还不知道。
解决方法是使用new
和delete []
运算符分配动态内存。
更好的是,尝试使用shared_ptr
, unique_ptr
or auto_ptr
。
答案 1 :(得分:0)
此
int* buffer;
不是数组的声明。它是指向int的指针的声明。
在构造函数
中threestack(int stacksize_u)
{
int buffer_u[stacksize_u*3];
this->buffer = buffer_u;
this->stacksize = stacksize_u;
}
所有这两个陈述
int buffer_u[stacksize_u*3];
this->buffer = buffer_u;
无效。所有大小的数组的firest应该是常量表达式。其次,将本地数组的第一个元素的地址指定给指针缓冲区。退出构造函数后,此地址将无效,因为本地数组将被销毁。
您应该使用operator new分配动态数组,并将其值分配给数据成员缓冲区,或者使用容器std::vector
而不是动态分配的数组。