【问题标题】:a special Person class in C++C++ 中的特殊 Person 类
【发布时间】:2012-11-29 22:21:40
【问题描述】:

我是 C++ 的新手,因为我正在大学学习它,但我遇到了一个问题。我有一个项目要做,应该很容易做,但我似乎遇到了一些困难。我必须实现一个 Person 类,它正好有 3 个参数:姓名、名字(这是我的大问题,因为可以在 char* 数组中放入多个姓名,所以它将是一个 char**)和年龄。我的老师给了我一个 testPerson.cc 文件,它使用我的 Person 类来创建几种类型的 Person。我的问题是当我创建构造函数时,因为我必须处理几种情况:例如,如果一个人只有一个名字,例如:

  const Personne lea ("Tralala", "Lea", 45);

或者一个人有多个名字:

  const char* prenoms1[] = {"Marcel", "Firmin", "Gaston", 0};
  const Personne marcel ("Meharcele",  prenoms1, 78);

我确定我必须有 3 个属性:name(char*)、firstname(char**)、age(int)。

这是老师给我的文件中的一个 sn-p(在创建我的 Person 类时我必须尊重):

int main () {
  cout << "We create the next persons:\n";

  // version of constructor with several names:
  const char* prenoms1[] = {"Marcel", "Firmin", "Gaston", 0};
  const Personne marcel ("Meharcele",  prenoms1, 78);

  // version of constructor with only one name:
  const Personne lea ("Tralala", "Lea", 45);

如您所见,对于只有 1 个 fname 或多个 fname 的情况,我需要多个构造函数 这是我的课:

#include "personne.h"

Personne::Personne(const char* name, const char** fnames, int a) {
    nom = name;
    prenom = fnames;
    age = a;

}
Personne::Personne(const char* name, const char* fname, int a) {
    nom = name;
    prenom = fname; //here I have a problem, since the attribute prenom is of type char**
    age = a;

}

void Personne::setAge(int& a) {
  age = a;
}

void Personne::setNom(const char* name) {
  nom = name;
}

void Personne::setPrenoms(const char** fnames) {

}

int Personne::getAge() const {
  return age;
}

char* Personne::getNom() const {
  return nom;
}

char** Personne::getPrenoms() const {
  return prenom;
}

我花了好几个小时思考一个解决方案,我用谷歌搜索了很多(所以我做了功课),只是我不知道如何实施正确的解决方案。

【问题讨论】:

  • 如果您可以使用 STL,使用std::vector&lt;std::string&gt; 会更容易

标签: c++ arrays class


【解决方案1】:

一些注意事项:

  • 可以将单个名字视为一个元素的数组,因此您仍然可以使用数组在内部存储名字列表,并在只有一个时将其大小设为 1。
  • 在您的构造函数中,您正在分配指针,这些指针在构造函数的调用者中分配在堆栈上,虽然这不会在您的特定片段中产生问题,但这不是正确的方法:您应该创建自己的人的每个值的副本,以便他们在参数丢失时不会丢失并在Personne析构函数~Personne()中管理它们的破坏
  • 我不知道你是否可以使用 STL 库,在这种情况下考虑使用string 来存储名称和vector&lt;string&gt; 名称列表,它们会为你做大部分的脏活

【讨论】:

  • +1 推荐使用字符串和向量。 C++ 的大部分坏名声来自于强制/鼓励初学者使用原始数组和指针,而使用字符串、向量等可以帮助他们更多地思考解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
相关资源
最近更新 更多