【问题标题】:Constructor doesn't accept char *构造函数不接受 char *
【发布时间】:2019-05-27 04:32:18
【问题描述】:

没有参数的构造函数工作,但另一个没有。 我很绝望,我什么都试过了

// 标题

 class Etudiant
        {
        private:
            char * name;
            unsigned int age;
            Date *datenaissance;
        public:
            Etudiant();
            Etudiant(char * c,unsigned int,Date&);
            ~Etudiant();
        };

这是我的 .cpp

    Etudiant::Etudiant()
    {
        this->name = new char();
        strcpy(name, "kabil");
        this->age = 18;

    this->datenaissance = new Date();
}

Etudiant::Etudiant(char * c, unsigned int a, Date &d)
{
    this->name = new char();
    strcpy(this->name,c);
    this->age = a;
    this->datenaissance = new Date(d);
}


Etudiant::~Etudiant()
{
    delete[]name;
    name = 0;
}

这是我的主线

int main()
{

    Date d();   
    Etudiant E(),E1("student",15,d);

    system("pause");

}

我应该改变什么?

【问题讨论】:

  • 使用std::string。并用Date d; 替换Date d();,否则你声明一个函数。
  • @solomonk -- 不要只是“添加”。删除所有 char * 内容并将其替换为 std::string
  • this->name = new char(); 这里分配一个字符。
  • 为什么datenaissance 是一个指针? name=0 应该是 name=nullptr 尽管它没用(法国的 C++ 课程通常很糟糕:()。
  • @Yksisarvinen -- 我没有说它不是 C++ 的一部分。问题是何时何地使用动态内存管理。 OP 的代码不需要对new 进行任何调用。其次,像这样给学生分配作业是 C++ 被放弃的主要原因之一,而这些学生却被 Java 或类似语言所吸引——当绝对不需要时,不能让最简单的程序正常工作是令人沮丧的对于那种挫败感。还有Stop teaching C when you're supposed to teach C++

标签: c++ arrays constructor char initialization


【解决方案1】:

要将文字字符串传递给函数,它必须具有char const * 类型的参数,而不是char *。所以你的构造函数应该有这个原型:

Etudiant(char const * c, unsigned int, Date &);

如上所述,您也没有分配足够的内存来在构造函数中复制字符串。这一行:

this->name = new char();

应该是:

this->name = new char[strlen(c) + 1];

所以你有足够的内存来进行这个复制操作:

strcpy(this->name, c);

【讨论】:

  • 请不要鼓励人们手动使用new(尤其是没有提及delete)。
  • @solomonk 您不应该使用该代码。使用std::string
  • 不幸的是,这似乎是一项任务。我在法国目睹了太多糟糕的 C++ 教学,我对@solomonk 不感到同情。
  • @MatthieuBrucher 是的:/我正在做我老师正在做的事情,你能告诉我我应该遵循哪些文档来专业地教授 c++ 吗?
  • 因未明确反对 C 样式字符串和 operator new[] 而被否决。这是一种糟糕的做法,对于初学者来说永远不应该被提及。
猜你喜欢
  • 2011-01-10
  • 2020-11-14
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 2016-09-03
  • 1970-01-01
相关资源
最近更新 更多