2013-08-16 39 views
1

作为一个练习,我试图创建一个类myArray,充当简化的数组类。这里是我的头:C++创建原始数组类

#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; 
} 

的问题是,当我运行这个,我什么都得不到,然后“按任意键继续...”提示。出了什么问题?

+1

不要忘了[三规则(http://stackoverflow.com/questions/4172722)。三分之二是不错的,但是你错过了一个复制分配操作符。 –

回答

1

构造函数myArray不会为my_data分配内存。第一次调用set时,它会尝试写入未初始化的指针。这会导致未定义的行为,但可能会导致崩溃。

你应该改变构造函数

myArray::myArray(int initMax) 
{ 
    my_capacity = initMax; 
    my_data = new ARRAY_ELEMENT_TYPE[my_capacity]; 
} 

有几个与代码的其他问题,您也可以考虑

在“设置”,测试

if(subscript > my_capacity - 1) 

应be

if(subscript < 0 || subscript > my_capacity - 1) 

或者您可以将subscript参数更改为unsigned int

sub,行cout << my_data[0];应该大概是return my_data[0];

+0

解决了大部分问题。现在我得到一个警告:'sub'中的所有返回路径都不会返回一个值,但我无法弄清楚if(subscript> = my_capacity)和else之外的内容。 我在'a.set(-1,-1.1)'的最后一次调用中发生崩溃,输出显示为'1.1-1。#IND'和一个堆损坏调试错误。 – spartanhooah

+0

我已经更新了我的答案,并注意到了造成这些问题的原因。 – simonc

+0

我错过了最后一行,它摆脱了#IND问题。感谢您的帮助(因为我还没有投票)。 – spartanhooah

1
myArray::myArray(int initMax) 
{ 
my_capacity = initMax; 
my_data = new ARRAY_ELEMENT_TYPE[my_capacity]; //You missed this 
} 
0

除了当前的实施缺少你分配,你也动态地分配内存。一个简单的数组类型不需要在堆上分配。 std::array集合完全符合您的要求。我会敦促你看看它的实施例子(如果这只是一个学术练习)。如果这是生产代码库,请使用已编写和测试的内容。

http://en.cppreference.com/w/cpp/container/array

+0

'std :: array'是静态大小的。直到明年我们才获得动态大小的数组和std :: dynarray,如果在编译时不知道大小,我们需要动态分配。 (这个问题确实表明这是一个练习,所以“使用vector”也不是有用的答案)。 –

+0

我并没有声明使用'std :: array'或'std :: vector'(除非它用于生产代码库)。我很清楚他应该看看'std :: array'的实现来了解它是如何完成的。他目前的实现创建了一个不可调整大小的动态分配数组(换句话说,他知道在编译时它有多大,但无论如何都是在堆上分配它)。 –

+0

不,当前实现将大小作为运行时构造函数参数,而不是像'array'那样的编译时模板参数。直到明年,你需要动态分配来处理这个问题。 (在这个例子中,大小是一个常量;但没有迹象表明该类应该限制在编译时间值)。 –