【问题标题】:Dynamic array of structures C++结构的动态数组 C++
【发布时间】:2020-04-14 08:27:24
【问题描述】:

我需要使用 C++ 创建动态电话列表

因此,我将采用的方法是创建一个简单的 1D 动态结构数组,其中每个结构都带有一个姓名和电话号码。

struct Person {
char Name[100];
char Phone_Number[100];};

现在我不确定如何创建一个函数,通过创建一个新结构并添加它来向列表中添加一个新条目。 类似于

void add () {
Person person1;
cout << "Please enter name:" << endl;
cin.getline(person1.Name, 100, '\n');
cout << "Please enter number:" << endl;
cin.getline(person1.Phone_Number, 100, '\n');
cout << "Successful!" << endl;}

??

【问题讨论】:

  • 请阅读std::vectorstd::string
  • C++ 的发明是为了让您不必处理此类问题。开始使用std:stringstd:vector 和所有其他面向对象编程支持的强大工具。
  • 这听起来像是家庭作业。您需要使用原始数组吗?
  • 我建议您在尝试使用Person 之前先使用int
  • 如果你想产生动态的方式,用字符串代替原始数据类型(char)。后来,将 person 类向量化为 vector People。 “人”是一组多个对象。

标签: c++ arrays function dynamic structure


【解决方案1】:

您需要使用指针来创建结构的动态数组。如果您想了解更多关于指针的技术信息,可以查看this page

要声明你的动态数组,你只需要声明:

int n = 10;
Person* persons = new Person[n];

n 将是您的总人数,persons 将是您的动态数组。您可以像普通数组一样访问成员。

cout<<persons[5].Name<<endl;

现在,要添加数组的新成员,您需要增加总人数,创建具有新大小的 Person 数组的新实例,然后将旧数组的值复制到新数组中。


void increaseArraySize(int n, Person* persons){
    Person* temp = new Person[n];

    for(int i=0; i < n; i++){
        temp[i] = persons[i];
    }

    persons = new Person[n+1];

    for(int i=0; i < n+1; i++){
        persons[i] = temp[i];
    }

    delete[] temp;
}

void add(int &n, Person* persons){
    Person person1;
    cout << "Please enter name:" << endl;
    cin.getline(person1.Name, 100, '\n');
    cout << "Please enter number:" << endl;
    cin.getline(person1.Phone_Number, 100, '\n');
    cout << "Successful!" << endl;

    increaseArraySize(n, persons);
    persons[n] = person1;
    persons[n] = person1;
    n++;
}

void print(int n, Person* persons){
    for(int i=0; i < n; i++){
        cout<<persons[i].Name<<endl;
        cout<<persons[i].Phone_Number<<endl;
        cout<<endl;
    }
}

int main(){
    int n = 0;
    Person* persons = new Person[n];

    add(n, persons);
    add(n, persons);

    print(n, persons);

    delete[] persons;
    return 0;
}

【讨论】:

  • 如果您打算在函数中更改指针的值,则必须将其指针作为参数传递。意思是双指针。喜欢人** 人。同样创建 temp 是完全没有必要的,并且在用新数组覆盖之前您没有释放原始 persons,因此存在内存泄漏。
  • 请不要在 C++ 中使用纯 C 样式的数组。并尽量避免在 C++ 中使用new。并且永远不要将原始指针用于拥有的内存。然后你会自动找到解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-03-13
  • 2012-10-11
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 2017-09-20
  • 1970-01-01
相关资源
最近更新 更多