【问题标题】:Problem: Create dynamic arrays in a class [closed]问题:在类中创建动态数组 [关闭]
【发布时间】:2019-05-24 19:55:17
【问题描述】:

我现在正在编写一个学生管理程序。我想不用字符串和库来学习如何使用指针。每个学生都有一个名字、一个号码和几门课程。我在课堂上管理学生的这些数据。名称和课程只应占用绝对必要的空间。但是,我不知道如何正确初始化它们并创建构造函数、setter 或 getter。稍后,我想在一个包含一组学生的班级中管理 Student 班级。

我已经尝试在一个附加数组中管理 char 课程数组。我没有成功。这就是为什么我现在创建了一个二维数组。我还提出了为课程和一系列课程创建额外课程的想法。但这不是我学习如何处理指针的方式。

学生.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

学生.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]),
{}

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

【问题讨论】:

  • 您的帖子中没有一个 ? 字符。您究竟需要什么帮助?
  • @MPops 哦,对不起。我完全忘记了真正的问题。我想摆脱错误代码,但我不知道如何。这就是我在这里寻求帮助的原因。
  • @EricOfficial 您也需要发布这些错误。目前我们不确定这意味着什么。

标签: c++ arrays object


【解决方案1】:

@MPops 非常感谢您的帮助。我希望我正确地实现了你的代码。这两个文件现在看起来像这样,它们不会产生错误: 学生.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; }

};

学生.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);
    }
```` 

【讨论】:

  • 您不了解指向 char 的指针是什么。您是否有任何资源或导师可以访问以帮助澄清这些事情?阅读本站:fredosaurus.com/notes-cpp/newdelete/50dynamalloc.html
  • @MPops 不幸的是,我们的讲师只向我们介绍该主题,并希望我们自己在家教。我再次了解了 char 指针的主题,并对代码进行了一些小改动。现在它向我显示警告:“非静态数据成员的类内初始化是 C ++ 11 扩展 [WC ++ 11-extensions] char * * myLvs = new char * [30];”在。你能帮我解决这个错误吗?
  • 错误说明了什么? in-class initialization of non-static data member...。您是否尝试在类的定义中初始化这个 myLvs 数组?你不能,因为它不是static。您需要在 constructor 函数中执行此操作。
【解决方案2】:

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

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

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

我也会调查strncpy

创建一个动态字符数组的数组... 比如[“数学”、“语言”、“写作”、“历史”]...

您需要一个array 的动态字符数组。

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)

【讨论】:

  • 我真的认为这是关于使用惯用 c++ 编程的坏建议。#
  • @πάνταῥεῖ 我同意,但我相信这项任务迫使他们自己进行内存管理。此外,即使与生产级代码无关,也不要直接回答问题的答案。
猜你喜欢
  • 2017-12-17
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多