创建和访问类对象的动态数组
Posted
技术标签:
【中文标题】创建和访问类对象的动态数组【英文标题】:Creating and accessing a dynamic array of class objects 【发布时间】:2016-12-01 19:46:04 【问题描述】:我一直在从事一个处理电话目录的项目。我的程序从数据表中读取数据并创建一组电话。
我有 2 个课程:软电话和车队。
Softphone 包含电话的所有值(私有)以及获取/设置和打印功能以访问它们(公共)。
class softphone
public:
string name;
//All my other variables
public:
softphone();
softphone(const softphone &obj);
~softphone();
//Get functions
string get_name();
//ect
//Set functions
void set_name(string);
//ect
//Print functions
void print_name();
//ect
Fleet 包含电话数组和输出操作函数
class fleet
private:
//Some variables and buffers
softphone* phone; ->This is the array containing all the phones
public:
//Read file and create array functions
//Functions
void print_fleet();
//More output functions
;
fleet 类有一个指向软电话的指针,我用它来动态创建电话数组。它通过从文件中读取目录来创建数组。 (我不知道运行时间之前有多少电话。)
它计算文件中的行数,然后创建一个足够大的数组来保存所有数据:
phone = new softphone[number_of_lines - 1]; //Line 1 is header
它从文件中读取,使用 set 函数保存数据,然后我使用递增指针 电话++;
到目前为止一切顺利。现在,如果我想访问这些电话并调用成员函数。
phone[0].print_name();
编译器没有给我任何错误,但输出是垃圾(屏幕上的无限随机字符。)我在内存位置异常得到 std::bad_alloc。
for(int i = 0; i < (number_of_lines - 1); i++)
phone--
phone->print_name();
现在可以了。通过这种方式,我可以访问所有手机并将它们打印出来。所有的数据都在那里。但是我必须增加/减少指针,我不能使用索引号。
如何使用索引号?还有,为什么我用的时候电脑会发疯,但增加的时候就没事了?
感谢您的回复,
【问题讨论】:
请edit您的问题与minimal reproducible example 或SSCCE (Short, Self Contained, Correct Example) 这会是另一个“我不能使用std::vector
”的要求吗?如果没有,std::vector<softphone> phone;
并放弃指针。此外,您的 softphone
类不需要用户定义的复制构造函数或析构函数——编译器默认版本可以正常工作。
【参考方案1】:
创建数组时,phone 指向第一个元素。之后,您开始递增指针,直到到达数组的末尾。此时,phone 不再指向数组的开头。然后,你运行你的循环,它通过指针返回,直到它回到开始,事情又开始工作了。我建议您停止使用指针算术,而只使用索引。然后,您可以确保 phone 始终指向数组的开头。或者,您可以分配一个不同的变量并将其用于您的指针来填充数组。或者,您可以按照@PaulMcKenzie 的建议使用 std::vector。
【讨论】:
使用这样的索引?电话[0].print_name(); 是的。但是,当您首先创建数据时,您应该只使用索引而不是指针算术。你说你这样做:“它从文件中读取,使用 set 函数保存数据,然后我使用 phone++ 递增指针;”而是遍历电话数组,但使用电话[i],而不是电话++。除非您更清楚递增指针的作用,并且您知道在该代码中需要一些额外的速度,否则使用索引会更简单、更清晰。我很少发现自己需要使用指针算法。 它可以编译但它不起作用,这是我问题的重点。我得到垃圾输出。但是,如果我增加指针并调用相同的函数,它就可以工作。那是我不明白的 只需删除所有使用 phone++ 和 phone-- 并使用 phone[0]、phone[1]、phone[i] 的地方,一切都应该工作。如果没有,请发布代码。 做到了。非常感谢楼主!以上是关于创建和访问类对象的动态数组的主要内容,如果未能解决你的问题,请参考以下文章