【问题标题】:Inheritance and array of types类型的继承和数组
【发布时间】:2014-07-25 17:48:49
【问题描述】:

我在 C++ 中有一个可能非常简单的问题。 假设我将类定义为:

类 PS { 私人:

int value;

int m;

public:

PS();
PS(int value, int m);
PS(int m);

};

现在我想用这种类型的元素定义一个数组。例如,

PS t[3];

但是,我希望这个数组中的所有元素都具有 m=2。我该怎么做?我假设我必须以某种方式使用继承,对吗? 所以例如我不想做这样的事情:

>PS t[3]; 
>t[0].PS(2);
>t[1].PS(2);
>t[2].PS(2);

我想为 t 的所有元素做一场表演。

【问题讨论】:

  • C++ 中没有“空白”之类的东西。如果你避免初始化一个变量,那么它的值是未定义的(又名“垃圾”)。
  • 决定你做什么,而不是你不想要/不喜欢什么。花点时间正确安排问题,查看答案和编辑对您没有多大帮助!
  • 数据结构(例如数组)和对象数组(例如 PS 对象数组)之间存在差异。假设您有一个成员变量“M”。您创建一个构造函数来初始化您的成员变量“M”,如下所示:PS(){m = 2;}。现在每次创建 PS 对象的实例时,例如: PS *t = new PS();然后调用 PS->m,你会得到 m = 2,一切都在构造函数中完成。现在,您可以使用 for 循环在长度为 3 或更大的数组上添加 PS Object 的指针。这个问题与继承无关,继承是多个类具有相同的属性。
  • 我认为这与 PS t[3](2,0); 之类的声明有关,但我知道它无效 (test.cpp:7:25: error: bad array initializer pair<int,int> T[3](0,0);)。

标签: c++ arrays inheritance


【解决方案1】:

使用您的构造函数,您可以简单地使用大括号初始化:

PS t[] = { PS(2) , PS(2), PS(2) };

或者正如@0x499602D2 所建议的那样,因为 PS 有一个非显式构造函数,简单地说:

PS t[] = { 2, 2, 2 };

我还建议您使用 std::array<> 而不是 C 样式的数组。

【讨论】:

  • 由于PS 有一个非explicit 构造函数,你也可以使用PS t[] = { 2, 2, 2 };
【解决方案2】:

不初始化值并不安全,但您可以使用 C++11 功能,该功能允许您直接在类定义中初始化变量:

class PS { 
private: 
  int value;
  int m = 2;

public:
  PS() {};
};

如果你使用的是旧版本的 C++,你可以考虑重载默认构造函数

class PS { 
private: 
  int value;
  int m;

public:
  PS(int _m = 2) : m(_m) {};
};

【讨论】:

    【解决方案3】:

    STL Vector 类优于 c 数组。使用一个,你可以这样做:

    std::vector<PS> t(3, PS(2));
    

    【讨论】:

    • 你应该几乎总是使用初始化列表。第一个代码示例的编码风格非常糟糕,尽管它可能不会对int 成员产生影响。
    • @ChristianHackl yipes,这值得 -1 吗?我试图向 OP 表明这是一种可能性,我什至谈论了如何首选字段初始化列表。我将编辑答案以进一步反映没有它们的不良做法。
    • 恢复了-1,因为您在答案中提到了不好的做法。是的,我认为最初是值得的,因为 IMO 您将不良做法作为默认的做事方式。尤其是看到这是来自 Java 的 C++ 初学者所犯的典型错误之一。
    • @ChristianHackl 公平点,我会确保在以后的回答中指出这一点,感谢您在应有的地方给予惩罚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2010-11-23
    • 1970-01-01
    相关资源
    最近更新 更多