我正在尝试用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;
}
如果可能,我该如何解决这个问题?
答案 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::array
或std::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; }