在构造函数中创建数组与在 C++ 中创建声明之间的区别

Difference between creating an array in constructor and declaration in c++

本文关键字:创建 之间 区别 声明 构造函数 数组 C++      更新时间:2023-10-16

当我尝试在 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]有很大不同。

然而,不知道你什么时候在构造函数中"动态"创建数组。出路是使用 newdelete [] 运算符分配动态内存。

更好的是,尝试使用 shared_ptrunique_ptrauto_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而不是动态分配的数组。