我有一个我不太懂的作业问题。
向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;
}
期待您的建议/答案。
谢谢
答案 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;
}
这样它就是一个构造函数,但你可以通过两种方式调用它:
newheight
或newheight
将拥有
默认值10.0。编辑在评论中回答问题:
如何使用这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个构造函数(正如您所做的那样),但是假设您在第三个中发现了一个错误:当然,您必须在第四个错误中修复它。如果你忘了怎么办?如果您只有一个功能,则代码更易于管理。另外,请考虑每个函数可以提供多个默认参数。如果您不必使用默认参数,则必须创建大量副本。它不会很好地扩展。