问题:在类中创建动态数组

时间:2019-05-24 19:55:17

标签: c++ arrays object

我正在编写一个学生管理程序。我想在没有字符串和库的情况下学习如何使用指针。每个学生都有一个名字,一个号码和几门课程。我在一个班级里管理学生的数据。名称和课程仅应占用绝对必要的空间。但是,我不确切地知道如何正确地初始化它们并创建构造函数,setter或getter。稍后,我想在一个由一系列学生组成的班级中管理学生班。

我已经尝试过在其他数组中管理课程的char数组。我没有成功。这就是为什么我现在创建一个二维数组的原因。我还想到了为课程和课程组创建额外的类的想法。但这不是我学习如何处理指针的方式。

student.h:

#ifndef STUDENT_H
#define STUDENT_H
#include <iostream>

class Student{
private:
    int myLength_name;
    char *myName; //=new char[myLength_name];
    int myMatrikel;
    int myLength_lv;
    char *myLv;       //=new char[myLength_lv];
                        //char **myLvs[30];
    int myAnzLv;
public:
    Student();
    Student(char *name_chars, int length_name, int matrikel, int length_lv, char **lv_chars[][30]);
    char &name_chars() const { return *myName; }
    int matrikel() const { return myMatrikel; }
    int length_name() const { return myLength_name; }
    int length_lv() const { return myLength_lv; }
    char &lv_chars() const { return *myLv; }

};

#endif // STUDENT_H

student.cpp:

Student::Student() :
    myLength_name(0),
    myName(nullptr),
    myMatrikel(0),
    myLength_lv(0),
    myLv(nullptr),
    myAnzLv(0)
{}

Student::Student(char *name_chars, int length_name, int matrikel, int length_lv, char *lv_chars[][30]):
    myLength_name(length_name),
    myName(name_chars=new char[myLength_name]),
    myMatrikel(matrikel),
    myLength_lv(length_lv),
    myLv(lv_chars=new char[myLength_lv][30]),
{}

有人可以帮助我创建没有错误的班级学生吗?我的指针真的不是很好,并且到目前为止还没有找到有用的手册。 提前致谢。 埃里克

2 个答案:

答案 0 :(得分:0)

@MPops 非常感谢您的帮助。希望我能正确实施您的代码。这两个文件现在看起来像这样,它们不会产生错误: student.h:

class Student{
private:
    char *myName;
    int myMatrikel;
    char *myLv;       //=new char[myLength_lv];
    char * * myLvs = new char*[30];
    int myAnzLv;
public:
    Student();
    Student(char *name_chars, int matrikel, char *lv_chars);
    char name_chars() const { return *myName; }
    int matrikel() const { return myMatrikel; }
    char lv_chars() const { return *myLv; }

};

student.cpp:

Student::Student() :
    myName(nullptr),
    myMatrikel(0),
    myLv(nullptr),
    myLvs(nullptr),
    myAnzLv(0)
{}

Student::Student(char *name_chars, int matrikel, char *lv_chars):
    myMatrikel(matrikel)
    {
    myName = new char[strlen(name_chars)+1];
    strcpy(myName, name_chars);
    myLv = new char[strlen(lv_chars)+1];
    strcpy(myLv, lv_chars);
    }
```` 

答案 1 :(得分:-1)

当创建一个具有char指针的类(用作动态char数组)时,我不相信您将能够使用构造函数的初始化列表功能。您首先应该通过...来验证它是否可以正常工作。

myName = new char[strlen(name_chars)+1];
strcpy(myName, name_chars);

这是执行此操作的最基本方法。但是,如果由于某种原因数据输入不正确(\0中没有name_chars字符),它并不是特别安全。但这是一个开始。

我也会研究strncpy

要创建动态字符数组的数组... 像[“数学”,“语言”,“写作”,“历史”] ...

您需要一个array个动态char数组。

char * course = new char[100]; // this is one char array of length 100.
char * * courses = new char*[10]; // this is 10 char pointers
courses[0] = new char[100]; // now, the first char pointer in courses
                            // is a dynamic array of length 100.

...
courses[9] = new char[100];
courses[10] = new char[100]; //!!!! THIS IS WRONG. Courses doesn't have 11 items in it.
                             // you can only use indexes 0-9 (10 char pointers)