创建和访问类对象的动态数组

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&lt;softphone&gt; phone; 并放弃指针。此外,您的 softphone 类不需要用户定义的复制构造函数或析构函数——编译器默认版本可以正常工作。 【参考方案1】:

创建数组时,phone 指向第一个元素。之后,您开始递增指针,直到到达数组的末尾。此时,phone 不再指向数组的开头。然后,你运行你的循环,它通过指针返回,直到它回到开始,事情又开始工作了。我建议您停止使用指针算术,而只使用索引。然后,您可以确保 phone 始终指向数组的开头。或者,您可以分配一个不同的变量并将其用于您的指针来填充数组。或者,您可以按照@PaulMcKenzie 的建议使用 std::vector。

【讨论】:

使用这样的索引?电话[0].print_name(); 是的。但是,当您首先创建数据时,您应该只使用索引而不是指针算术。你说你这样做:“它从文件中读取,使用 set 函数保存数据,然后我使用 phone++ 递增指针;”而是遍历电话数组,但使用电话[i],而不是电话++。除非您更清楚递增指针的作用,并且您知道在该代码中需要一些额外的速度,否则使用索引会更简单、更清晰。我很少发现自己需要使用指针算法。 它可以编译但它不起作用,这是我问题的重点。我得到垃圾输出。但是,如果我增加指针并调用相同的函数,它就可以工作。那是我不明白的 只需删除所有使用 phone++ 和 phone-- 并使用 phone[0]、phone[1]、phone[i] 的地方,一切都应该工作。如果没有,请发布代码。 做到了。非常感谢楼主!

以上是关于创建和访问类对象的动态数组的主要内容,如果未能解决你的问题,请参考以下文章

反射学习4-通过反射机制动态创建和访问数组

创建抽象类的动态数组

如何以多态方式创建对象的动态数组?

在类中创建一个空的动态数组,在访问时给出值?

在 C++ 中的类中创建类对象的动态数组

数组类的创建(下)