作为练习,我试图创建一个充当简化数组类的myArray类。这是我的标题:
#ifndef myArray_h
#define myArray_h
typedef double ARRAY_ELEMENT_TYPE;
class myArray {
public:
//--constructors
myArray(int initMax);
// post: Allocate memory during pass by value
myArray(const myArray & source);
// post: Dynamically allocate memory during pass by value
//--destructor
~myArray();
// post: Memory allocated for my_data is deallocated.
//--modifier
void set(int subscript, ARRAY_ELEMENT_TYPE value);
// post: x[subscript] = value when subscript is in range.
// If not, an error message is displayed.
//--accessor
ARRAY_ELEMENT_TYPE sub(int subscript) const;
// post: x[subscript] is returned when subscript is in range.
// If not, display an error message and return [0].
private:
ARRAY_ELEMENT_TYPE* my_data;
int my_capacity;
};
#endif
这是我的实现:
#include "myArray.h"
#include <iostream>
#include <cstring>
using namespace std;
typedef double ARRAY_ELEMENT_TYPE;
//--constructors
myArray::myArray(int initMax)
{
my_capacity = initMax;
}
myArray::myArray(const myArray & source)
{
int i;
my_data = new ARRAY_ELEMENT_TYPE[source.my_capacity];
for(i=0; i < my_capacity; i++)
my_data[i] = source.sub(i);
}
//--destructor
myArray::~myArray()
{
delete [ ] my_data;
}
//--modifier
void myArray::set(int subscript, ARRAY_ELEMENT_TYPE value)
{
if(subscript > my_capacity - 1)
{
cout << "**Error: subscript " << subscript << " not in range 0.." << my_capacity-1 << ". The array is unchanged." << endl;
}
else
my_data[subscript] = value;
}
//--accessor
ARRAY_ELEMENT_TYPE myArray::sub(int subscript) const
{
if(subscript >= my_capacity)
{
cout << "**Error: subscript " << subscript << " not in range 0.." << my_capacity-1 << ". Returning first element." << endl;
cout << my_data[0];
}
else
{
return my_data[subscript];
}
}
我将其用作测试驱动程序:
#include <iostream>
using namespace std;
typedef double ARRAY_ELEMENT_TYPE;
#include "myArray.h"
void show (const myArray & arrayCopy, int n)
{
for(int j = 0; j < n; j++)
cout << arrayCopy.sub(j) << endl;
}
int main()
{
int n = 6;
myArray a(6);
a.set(0, 1.1);
a.set(1, 2.2);
a.set(2, 3.3);
a.set(3, 4.4);
a.set(4, 5.5);
a.set(5, 6.6);
show(a, n);
cout << a.sub(11) << endl;
a.set(-1, -1.1);
return 0;
}
问题是,当我运行此命令时,我什么都没得到,然后提示“按任意键继续...”。怎么了
最佳答案
myArray
构造函数不为my_data
分配内存。首次调用set
时,它将尝试写入未初始化的指针。这将导致不确定的行为,但很可能导致崩溃。
您应该将构造函数更改为
myArray::myArray(int initMax)
{
my_capacity = initMax;
my_data = new ARRAY_ELEMENT_TYPE[my_capacity];
}
您还可以考虑代码中的其他几个问题
在“设置”中,测试
if(subscript > my_capacity - 1)
应该
if(subscript < 0 || subscript > my_capacity - 1)
或者,您可以将
subscript
参数更改为unsigned int
类型。在
sub
中,行cout << my_data[0];
大概应该是return my_data[0];
关于c++ - C++创建基本数组类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18279498/