C ++程序打印随机值

时间:2016-04-06 13:43:21

标签: c++ function pointers

我正在尝试用C ++进行OOP。我宣布了一个类testOOP并在其中创建了一些私有成员。我使用add(int x)函数在封装数组中添加了值。但是当我尝试通过printArray方法打印它时,它输出的结果不正确。

以下是我的尝试。有人可以解释一下为什么我得到的结果与20 10 30 40不同吗?

#include <iostream>

using namespace std;

class testOOP
{
    private:
        int *a;
        int size;
        int last;

    public:
        testOOP();
        void add(int);
        void printArray();
};

testOOP::testOOP(void){

    size = 15;
    last = -1;
    int data[size];
    a = data;
    for(int i=0;i<size;i++){
        *(a+i)=0;
        //cout<<*(a+i);
        //cout<<"\n";
    }
}


void testOOP::printArray(){
    for(int i=0;i<=last;i++){
        cout<<*(a+i)<<" ";
    }
    cout<<endl;
}

void testOOP::add(int x){
    if(last+1 != size){
        last = last+1;
        *(a+last)=x;
    }
}

int main( )
{
    testOOP A;
    A.add(20);
    A.add(10);
    A.add(30);
    A.add(40);
    A.printArray();
    return 0;
}

如果可能,我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

使用构造函数中的代码:

int data[size];
a = data;

data是一个本地数组,当它离开构造函数时会被销毁。然后a将被悬空,取消引用就是UB。你可以

1. new[]构造函数中的数组(以及析构函数中的delete[])。如:

testOOP::testOOP(void){

    size = 15;
    last = -1;
    a = new int[size];
    for(int i=0;i<size;i++){
        *(a+i)=0;
        //cout<<*(a+i);
        //cout<<"\n";
    }
}

2.使用std::arraystd::vector

答案 1 :(得分:0)

构造函数

testOOP::testOOP(void){

    size = 15;
    last = -1;
    int data[size];
    a = data;
   //...

无效。所有C ++的Frist都不支持可变长度数组。所以这个数组的声明

    size = 15;
    int data[size];

无效。

指针指向本地数组data的第一个元素,它将在退出构造函数后被销毁。因此它将具有无效值,并且程序将具有未定义的行为。

您最初可以创建类的数组数据成员而不是指针。

例如

#include <iostream>

class testOOP
{
private:
    const static size_t max_size = 15;
    int a[max_size];
    size_t last;

public:
    testOOP() : a{}, last( 0 ) {}
    void add( int x )
    {
        if ( last != max_size ) *( a + last++ ) = x;
    }        
    void printArray( std::ostream &os = std::cout ) const
    {
        for ( size_t i = 0; i < last; i++ ) os << *( a + i ) << ' ';
        os << std::endl;
    }        
};

int main()
{
    testOOP A;
    A.add(20);
    A.add(10);
    A.add(30);
    A.add(40);

    A.printArray();
}    

程序输出

20 10 30 40 

如果编译器不支持ctor初始化列表中的数组初始化

testOOP() : a{}, last( 0 ) {}
            ^^^

然后你可以写

testOOP() : last( 0 ) 
{
    for ( size_t i = 0; i < max_size; i++ ) *( a + i ) = 0;
}

答案 2 :(得分:0)

这些行:

int data[size];
a = data;

不正确。您在堆栈上创建一个数组并将其分配给类成员变量。当代码到达testOOP::testOOP的末尾时,将释放此堆栈分配的内存。

您应该在构造函数中使用new并在desctuctor中使用delete[]或使用自动处理内存的std::vector

testOOP::testOOP() : size(15), last (-1), a (new int [size]) {
... // fill in the array
}

// also update your class declaration so that 'a' is declared after 'size',
// otherwise 'a(new int[size])' will use uninitialized size

//add the destuctor:
testOOP::~testOOP() { delete [] a; }