[英]C++ Dynamic Array Template issue
我仍然是学校的初学者程序员,因此被分配了此问题:
“制作自己的动态数组模板。它应该允许创建连续的数组(填充相同类型的东西),您可以扩展这些数组而不必担心空间不足。
使用malloc和free做一个版本。
使用new和delete做一个版本。”
到目前为止,这就是我所拥有的:
#include <iostream>
#include <sstream>
#include "Array.h"
using namespace std;
int main(){
Array<int> *testArray = new Array<int>(5);
testArray->initArray();
testArray->printArray();
testArray->addData(7);
testArray->printArray();
return 0;
}
这是“ Array.h”文件:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
template<typename T>
class Array{
public:
Array(int size){
size = size;
data = new T[size];
};
Array<T> *addData(T dataToAdd){
Array <T> *tmp = new Array <T> (this->size);
tmp->data = this->data;
Array <T> *newData = new Array<T> (this->size + 1);
for (int i = 0; i < this->size + 1; ++i){
if (i < this->size){
//newData->data[i] = tmp->data[i];
newData->setData(tmp->getData()[i], i);
}
else{
//newData->data[i] = dataToAdd;
newData->setData(dataToAdd, i);
}
}
return newData;
};
void initArray(){
for (int i = 0; i < this->size; ++i){
//this->data[i] = i;
this->setData(i, i);
}
};
void printArray(){
ostringstream oss;
string answer = "";
for (int i = 0; i < this->size; ++i){
oss << this->data[i] + " ";
//cout << this->data[i] << " ";
}
answer = oss.str();
cout << answer << "asdf" << endl;
};
T* getData(){
return this->data;
}
int getSize(){
return this->size;
}
void setData(T data, int index){
this->getData()[index] = data;
}
private:
int size;
T* data;
};
到目前为止,应该在我的主文件中发生的是应该有一个由5个int组成的数组,这些数组已从initArray函数初始化为0、1、2、3、4。
然后,它应该打印出显示“ 0 1 2 3 4”的数组,并添加另一个“ 7”,然后打印出显示“ 0 1 2 3 4 7”的新数组。
出于某种原因,我认为这与在两个文件之间移动时丢失数据有关,我的Array类的“数据”字段未正确更改。
我什至在主程序上对此进行了硬编码,在其中我使用setData函数编写了一个for循环,该函数将Array初始化为“ 0 1 2 3 4”,然后使用另一个for循环手动打印出这些值,但输出仅为0 0 0 00。”
现在,如代码所示,输出为:
asdf
asdf
由于之前是输出空格,因此我添加了“ asdf”,以查看我的printArray是否可以正常工作。
总结一下,为什么我的私有字段“数据”中的数据没有正确存储? 我对使用C ++编程非常陌生,任何建议将不胜感激。 谢谢您的宝贵时间,如果有任何您不了解的内容,请澄清一下,我会尽力而为。
编辑:问题解决了! 谢谢大家的帮助,问题出在我的构造函数以及我如何在main中调用函数。
一个问题是您的构造函数:
Array(int size){
size = size;
data = new T[size];
};
拥有它的方式只是将您的size参数分配给它自己,这没有任何效果。 解决该问题的一种方法是对参数使用不同的名称:
Array(int size_arg){
size = size_arg;
data = new T[size_arg];
};
但是,首选方法是使用构造函数初始化器语法:
Array(int size) : size(size), data(new T[size]) {};
使用构造函数初始化器语法,编译器知道您正在尝试初始化特定成员,并且不会在参数名称和成员名称之间造成混淆。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.