我正在尝试创建一个具有类动态数组的示例,以使用户驱动器和复制构造函数。
该程序的想法如下。我有两个私人字段的LabTest。ntest一个整数,该整数具有带有NTEST元素的动态数组的测试和值的数量。
i添加了将动态数组扩展到一个并将参数添加到最后一个位置的方法。
i添加了一个朋友函数最大值,该功能最大值返回动态数组的最大元素(逐个值对象调用(,以证明复制构造函数的必要性。
i超载<<为了打印对象。
我添加了默认构造函数,驱动器,复制构造函数。
我到目前为止写的代码是
#include<iostream>
using namespace std;
class Labtest {
public:
Labtest();
Labtest(const Labtest& a);
~Labtest();
friend int max(Labtest a);
friend ostream& operator <<(ostream& out, const Labtest& lab);
void add_value(int a);
private:
int ntests;
int *values;
};
int main()
{
Labtest chem;
chem.add_value(10); chem.add_value(20);
cout << chem;
cout << "the maximum is " << max(chem) << endl;
cout << chem;
return 0;
}
Labtest::Labtest() : ntests(0), values(NULL)
{
}
Labtest::Labtest(const Labtest & a) : ntests(a.ntests)
{
values = new int(ntests);
for (int i = 0; i < ntests; i++)
values[i] = a.values[i];
}
Labtest::~Labtest()
{
ntests = 0;
delete[] values;
}
void Labtest::add_value(int a)
{
int *newvalues = new int(ntests+1);
for (int i = 0; i < ntests; i++)
newvalues[i] = values[i];
newvalues[ntests] = a;
delete[] values;
values = newvalues;
ntests++;
}
int max(Labtest a)
{
int m = a.values[0];
for (int i = 1; i < a.ntests; i++)
if (m < a.values[i])
m = a.values[i];
return m;
}
ostream& operator <<(ostream & out, const Labtest& lab)
{
for (int i = 0; i < lab.ntests; i++)
out << lab.values[i] << " ";
out << endl;
return out;
}
我在Visual Studio中出现了堆错误。即使我对最大函数的呼叫发表评论。
任何帮助将不胜感激!
new int(10)
使int
变量具有值10。 new int[10]
的数组为10 int
s。从上下文中,很明显您打算使用第二种形式。当您致电delete[] values;
时(因为values
不是数组(或访问第一个以外的任何元素时,第一个表单的使用将导致不确定的行为。
当您分配数组时,应该使用括号而代替[]
int *newvalues = new int[ntests+1];
模板类SDT :: vector仅提供您需要的功能 - 而无需您参与内存管理的详细信息。但是,如果要练习内存管理,我应该提醒您3个注释:
数组的语法新操作符是
new type_spec[n]
不是新的type_spec(n)
。您使用的语法只需分配一个对象并用n对其进行初始化。因此,用数组删除操作员将其处置为UB。删除后将指针无效更安全。
定义任何含水系统资源的类(在这种情况下为heap memmory(时,通常要定义以下函数:
复制构图。
交换功能。
移动构造函数,通常是在互换方面。
以交换为单位移动/复制提出操作员或两者兼而有之。
destructor在交换方面。
否则 - 迟早 - 违反1个或更多资源处理规则的原因是由于忘记了隐式临时对象生成或其他语义。