使用不同的构造函数创建类的实例

时间:2015-11-29 00:48:06

标签: c++ class oop object constructor

我有一个我不太懂的作业问题。

  

向Critter类添加三个构造函数。每个构造函数都应该   还可以在屏幕上打印一条简单的信息性消息   可以看到何时以及调用了哪个构造函数。你应该可以   创建Critter类的实例1)而不提供任何实例   属性(应将名称设置为“默认生物”,高度   通过仅提供名称作为参数,以5和其余为0),2)   (应将高度设置为5,其余设置为0),以及3)by   提供名称,饥饿,无聊和身高作为参数。您   也应该能够在没有的情况下创建Critter类的实例   指定高度。如果没有提供高度,那么小动物就有了   默认高度为10.编写一个创建四个的测试程序   通过使用这三种不同的构造函数来实现Critter的实例   (最后两种方式)。通过使用将他们的饥饿等级设置为2   适当的方法和/或构造函数调用。生物的属性   然后应该在屏幕上打印出来。

好的,首先我创建了一个类Critter然后我在其中添加了3个构造函数,如第1,2和3点所述。然后我创建了一个对象或实例(它们是相同的权利) ?)。之后我创建了另一个对象并创建了另一个构造函数。问题是,我在最后3个句子中丢失了:

  
    

编写一个创建四个的测试程序     通过使用这三种不同的构造函数来实现Critter的实例     (最后两种方式)。通过使用将他们的饥饿等级设置为2     适当的方法和/或构造函数调用。生物的属性     然后应该在屏幕上打印出来。

  

如何使用这三种不同的构造函数创建4个Critter实例?

这可能听起来像一个愚蠢的问题,但我从来没有上过课。我是程序编程的粉丝。

这是我的代码:

Critter.h

class Critter {

    // The following data members are private
    private:
        std::string name;
        int hunger, boredom;
        double height;

    public:

        Critter();
        Critter(std::string& newname);
        Critter(std::string& newname, int newhunger, int newboredom, double newheight);
        Critter(std::string& newname, int newhunger, int newboredom);

};

在我写的另一个文件中:

Critter.cpp

#include <iostream>
#include "Critter.h"

using namespace std;

Critter::Critter() {
    name = "default critter";
    height = 5.0;
    hunger = 0;
    boredom = 0;
    cout << "First with no properties." << endl;
}

Critter::Critter(string& newname) {
    name = newname;
    height = 5.0;
    hunger = 0;
    boredom = 0;
  cout << "Only name as a parameter." << endl;
}

Critter::Critter(string& newname, int newhunger, int newboredom, double newheight) {
    name = newname;
    height = newheight;
    hunger = newhunger;
    boredom = newboredom;
  cout << "All as parameters." << endl;
}

Critter::Critter(string& newname, int newhunger, int newboredom) {
    name = newname;
    height = 10.0;
    hunger = newhunger;
    boredom = newboredom;
  cout << "All as parameters." << endl;
}

和主文件:

#include <iostream>
#include "Critter.h"

using namespace std;

int main() {

    Critter first_instance, second_instance;

    string name;
    int hunger, boredom;
    double height;


    return 0;
}

期待您的建议/答案。

谢谢

1 个答案:

答案 0 :(得分:4)

你已经创建了4个构造函数,但是他们希望你有3个,最后一个应该以2种方式使用。前两个很好,他们希望你做的是通过使用default arguments函数将你的第三个和第四个构造函数合并为一个构造函数。像这样:

Critter::Critter(string& newname, int newhunger, int newboredom, double newheight = 10.0) {
    name = newname;
    height = newheight;
    hunger = newhunger;
    boredom = newboredom;
  cout << "All as parameters." << endl;
}

这样它就是一个构造函数,但你可以通过两种方式调用它:

  1. 包含所有参数,包括newheight
  2. 只提供前三个,然后newheight将拥有 默认值10.0。
  3. 编辑在评论中回答问题:

    如何使用这3个构造函数创建4个实例?

    该行

    Critter my_first_critter;
    

    将创建一个名为my_first_critter的类Critter的对象,没有参数,这意味着编译器将选择第一个构造函数,并且您将读取“First with no properties。”。相反,像

    这样的行
    Critter my_second_critter("John");
    

    将创建一个名为my_second_critter的类Critter的新对象,并且由于有一个字符串参数,编译器将选择第二个构造函数,因此您将读取“Only name as a parameter。”。然后,像

    这样的一行
    Critter my_third_critter("James", 2, 3, 5.5);
    

    (注意第四个参数!)将再次创建一个对象,类Critter并调用my_third_critter,并且由于有四个参数,类型为:string,int,int,double,编译器将调用第三个构造函数,你会读到“All as parameters。”。最后,像

    这样的一行
    Critter my_fourth_critter("Peter", 2, 3);
    

    (注意第四个参数丢失!)会调用相同的函数,因为在这种情况下默认参数会启动。编译器仍会将此调用与第三个构造函数匹配(这样您将再次阅读“All作为参数。“),但在这种情况下,高度将是默认值10.0,因为创建对象的程序员(你)没有指定值。

    将高度的默认值设置为10.0非常有用,如果经常发生高度为10.0,并且每次创建Critter时都不想浪费时间指定此数字(这也是容易出错:想想拼写错误或混淆......)。但是,如果您需要10.0以外的值,则可以轻松提供。而且由于它只是一个构造函数,而不是两个独立的构造函数,因此您需要管理的代码更少。当然,您可以避免使用默认参数并编写2个构造函数(正如您所做的那样),但是假设您在第三个中发现了一个错误:当然,您必须在第四个错误中修复它。如果你忘了怎么办?如果您只有一个功能,则代码更易于管理。另外,请考虑每个函数可以提供多个默认参数。如果您不必使用默认参数,则必须创建大量副本。它不会很好地扩展。