两个构造函数(带 & 不带参数),无输入 -> 无参数运行。跳过上述类中的构造函数

Posted

技术标签:

【中文标题】两个构造函数(带 & 不带参数),无输入 -> 无参数运行。跳过上述类中的构造函数【英文标题】:Two constructors (with & without parameter), no input -> run without parameter. Skipping constructors in the classes above 【发布时间】:2018-02-21 15:43:49 【问题描述】:

现在我有一个包含多个子类的类。所有类都包含一个构造函数,要求在每个类中输入数据(它是私有的,因此每个类都要求它自己的数据)。现在,我正在研究一个需要名称的子类。如果用户按 ENTER(无输入),它将运行不带参数的类的构造函数。如果有任何输入,它将将该输入放入具有参数的类的构造函数中。

我的问题是,每当我没有输入时,它都会询问它应该提出的所有问题(来自子类之上的类),并且运行良好。但是,它会跳过名称的第一个字母。例如,我将“Jordan”写为名称,然后将其保存为“ordan”。

其次,如果我没有输入,它将使用没有参数的构造函数。它询问名称(它是由主类“主”构造器询问的。我写了名称,它跳过了子构造器的所有其他问题——这是不应该做的。

我试图在 case 'F' 中创建一个对象:like Fish f1;这行得通,但这不是我应该在这里做的(家庭作业)。会是什么?我认为可能是 cin.ignore();搞砸了,但我需要它。

我觉得很难解释,但是如果您使用下面的代码执行以下操作(在控制台中编写)。

    系统会要求您写“F”来添加一条鱼,请写 F。 随便写一个名字(不为空)。 所有其他问题都将得到回答,这是不应该的。构造函数应该问问题 - 这是第一个 问题。

再一次,从新开始:

    写“F”来添加一条鱼。 什么都不写,只要在询问姓名时按 Enter。 随便写一个名字。 在淡水问题上写 y 或 n,下一个问题同理。 您会看到名称的首字母已丢失。

这是代码(缩短):

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <iostream>
using namespace std;

const int STRLEN = 20;

// FUNCTIONS
bool Question(); // User input y or n, sets the correct bool value
void Answer(bool n);    // Changes true to yes, false to no

class Animal 
private:
    char name[STRLEN];

public:
    Animal()  cout << "\nAnimal name: "; cin.ignore();  cin.getline(name, STRLEN); 
    Animal(char nam[])  strcpy(name, nam);  // Const with parameter, sent from Fish-class

    void writeName()  cout << "Name: " << name << '\n';  
;

class AnimalWater : public Animal 
private:
    bool freshwater;

public:
    AnimalWater()  cout << "Freshwater? (y/n): "; freshwater = Question(); 
    AnimalWater(char name[]) : Animal(name)   // Sendes name (used by Fish) up to Animal-class
    void writeWater()  cout << "Freshwater? "; Answer(freshwater); cout << '\n'; 
;

class Fisk : public AnimalWater 
private:
    bool haveGills;

public:
    Fisk()  cout << "Does the fish have gills? (y/n): "; haveGills = Question(); 
    Fisk(char name[]) : AnimalWater(name)   // Send the Fish name up to Animal-class
    void writeGills()  Answer(haveGills); 
;

int main() 
    char choice;

    cout << "\nWrite F to add a fish: ";
    cin >> choice; choice = toupper(choice); 

    while (choice != 'Q')              // If not Q(uit), run
        switch (choice) 
        case 'F': 
            char fishname[STRLEN];
            cout << "Name of the fish: "; cin.ignore();
            cin.getline(fishname, STRLEN);

            if (strlen(fishname) > 0)   // if user input > 0
                Fisk f1(fishname); // sned fishname as parameter to the Fish constructor
                f1.writeName(); f1.writeWater(); f1.writeGills();
            
            else   // else use the constructor without parameter
                Fisk f1; f1.writeName(); f1.writeWater(); f1.writeGills(); 
            
            break;
        
        

        cout << "\n\nWhat to do? ";
        cin >> choice; choice = toupper(choice);
    
    return 0;


bool Question()  
    char answer; cin >> answer; answer = toupper(answer); 
    if (answer == 'Y') return true; 
    else return false;


void Answer(bool n) 
    if (n) cout << "yes";
    else cout << "no";

【问题讨论】:

【参考方案1】:

出现吃掉第一个字母的问题是因为你在Animal 的构造函数中吃掉了一个字符。调用cin.ignore() 会忽略一个字符。如果您在cin &gt;&gt; 之后使用cin.getline(),这没问题,因为operator&gt;&gt;\n 留在缓冲区中,而cin.getline() 将读取空字符串。但是,在您的情况下,它不会发生。你应该到处使用cin &gt;&gt; 方法。

此外,在大多数情况下,在模型的构造函数中从用户那里获取输入并不是一个好方法。

【讨论】:

以上是关于两个构造函数(带 & 不带参数),无输入 -> 无参数运行。跳过上述类中的构造函数的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript--关于实例对象带不带参数和构造函数带不带参数的关系

C++:调用无参数的构造函数为啥不加括号

此类应在 android manifest 中提供默认构造函数(不带参数的公共构造函数)

hibernate 为什么持久化类时必须提供一个不带参数的默认构造函数

构造函数

构造函数