在构造函数中创建数组与在 C++ 中创建声明之间的区别
Difference between creating an array in constructor and declaration in c++
当我尝试在 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 = %dn", 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 = %dn", 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("%dn", test.peek(2));
}
cout<<endl;
printf("The top of stack 1 is %dn", test.peek(1));
// std::cout << "Hello, World!n";
return 0;
}
C++数组在编译时具有固定的大小。这就是测试模块工作的原因 - 大小 (=300) 在编译时是已知的。这是强制性的,因为数组的大小实际上是其类型的一部分,这意味着int[1]
的类型与int[2]
有很大不同。
然而,不知道你什么时候在构造函数中"动态"创建数组。出路是使用 new
和 delete []
运算符分配动态内存。
更好的是,尝试使用 shared_ptr
、 unique_ptr
或 auto_ptr
.
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;
无效。所有大小的数组中的最细微的应该是常量表达式。其次,将本地数组的第一个元素的 adrress 分配给指针缓冲区。从构造函数退出后,此地址将无效,因为本地数组将被销毁。
应使用运算符 new 动态分配数组并将其值分配给数据成员缓冲区,或者使用容器std::vector
而不是动态分配的数组。
相关文章:
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 如何在进程之间创建双向通道?
- 创建变量之间的运算符排列
- r-在Rcpp和C++之间转换矢量(使用Rcpp::as或Rcpp:::wrap)是否会创建一个新的矢量并复制元素
- Qml - c++ 类和 QmlRegisterType 创建的类之间的交换日期
- C++ std::vector 创建对象然后添加对象与在向量中创建对象之间的区别?
- 使用动态创建的选项卡元素在C 和QML之间绑定
- 使用 SDDL 或手动创建安全描述符之间的区别
- 从 1 中创建新的字符 * 作为参数,元素位于 2 个索引之间
- 创建一个带有限制的数字数据类型,一个介于 -10 和 10 之间的整数
- 如何使用C#或C 之间创建文本框之间的链接
- 我创建的c++istream对象和cin之间的区别在哪里,它在库中的可见位置在哪里
- 在构造函数中创建数组与在 C++ 中创建声明之间的区别
- 我正在尝试创建一个程序,用户在其中输入一系列数字,并且我想列出范围之间的质数
- 创建、处理和在窗口QTCreator之间切换
- 我正在尝试在下划线之间创建空格,这代表一个秘密短语
- 如何创建一个向量,用户可以在菜单更改之间继续添加值
- 如何在 2d 颜色选取器中创建返回 2 种颜色之间的颜色的函数
- Qt在文件夹之间创建链接
- C++中模板结构创建之间的差异