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

时间:2014-02-17 20:30:07

标签: c++ arrays constructor declaration

当我尝试在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;
}

2 个答案:

答案 0 :(得分:3)

C ++数组在编译时具有固定大小。 这就是您的测试模块工作的原因 - 在编译时已知大小(= 300)。 这是强制性的,因为数组的大小实际上是它的类型的一部分,这意味着 int[1]的类型与int[2]非常不同。

然而,当你在构造函数中“动态”创建数组时,还不知道。 解决方法是使用newdelete []运算符分配动态内存。

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