2016-04-06 47 views
0

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

下面是我试过的。有人可以解释为什么我得到的结果不同于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; 
} 

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

+0

'data'对构造函数是本地的,只要构造函数结束,它就会被销毁。那么'a'就是一个悬挂指针,你不能使用它。 – Quentin

回答

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

+0

谢谢@songyuanyao – sumit

+0

@sumit不客气。 – songyuanyao

0

构造

testOOP::testOOP(void){ 

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

是无效的。所有C++中的第一个不支持可变长度数组。所以这个数组的声明

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 

如果你的编译器不支持数组这样的初始化在构造函数初始化列表

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

那么你就可以只写

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

那么我应该如何处理这种情况。能否请你帮忙 ? – sumit

+0

@sumit查看我更新的帖子。 –

0

这些行:

int data[size]; 
a = data; 

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

您应该在构造函数中使用new,在内部使用内存处理内存时使用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; }