构造函数中的 Cin 和 cout

Posted

技术标签:

【中文标题】构造函数中的 Cin 和 cout【英文标题】:Cin and cout in a constructor 【发布时间】:2018-02-20 19:52:11 【问题描述】:

我被告知要从构造函数中读取名称(作业),但是类构造函数不应该接受任何参数——我觉得这很奇怪。

我试图简单地将 cout 和 cin.getline 放在构造函数中,但这不起作用。我不知道如何在没有任何参数的构造函数中从用户读取数据。有可能吗?

例如

class Animal

  private:
    char name[20];

  public:
    Animal()  SOMEHOW READ NAME HERE WITHOUT CON. PARAMETER 
;

int main() 

  Animal a1; // should ask for name and read it, add it to data
  return 0;

【问题讨论】:

为什么不起作用?它应该。请创建一个minimal reproducible example。 @Richardo “不起作用”是什么意思?它做了你没想到的事情吗? @Richardo 在问题中而不是在评论中提供其他信息。 @Richardo “它不起作用”不是对问题的有用描述。请解释如何它不起作用。它编译失败吗?它的行为是否出乎意料?观察到的行为与您的预期有何不同? 我被告知要从构造函数中读取名称 这太糟糕了。这是非常糟糕的做法。如果可以,请找一个更好的导师。最好收集main 中的输入并从main 中读取的数据构造Animal 对象。 【参考方案1】:
#include  <iostream>
#include <sstream>

class Animal

public:
 Animal() : name()

    // Not the best design approach.Just show it possible for the question.
    std::cout << "Name of animal?" << std::endl;
    std::getline(std::cin, name);
    std::cout << name << std::endl;

private: 
   std::string name;
;

int main(int argc, char * argv[])

Animal a1; // should ask for name and read it, add it to data
return 0;

【讨论】:

您真的需要std::endl 需要的额外内容吗? '\n' 结束一行。 \n 不是独立于平台的 :) 为什么需要将name转换为const char *才能打印出来? 与 std::endl 相关的有趣帖子:***.com/questions/213907/c-stdendl-vs-n 和 ***.com/questions/8311058/… @Santhosh:不正确。 \nstd::endl 一样独立于平台。唯一的区别是std::endl 也执行刷新。【参考方案2】:

我相信下面的代码是不言自明的,cmets 可以指导您。在面向对象中,一个类应该包含 setter 和 getter 方法。我用一个私有字符串变量name 创建了一个类Animal。在构造函数中,我要求一个名称并将其分配给正在创建的对象的name 变量。然后,我使用称为getName() 的方法显示name,该方法返回当前对象的名称,它也称为getter 方法。我相信你是面向对象的新手,我希望我已经让你理解了这些概念。

#include <iostream>

using namespace std;

class Animal

  private:string name;

  public: Animal() 
        cout<<"Enter the animal's name?";
        getline(cin,this->name); //sets the current obj's name (storing the value)
        cout<<"The animal's name is "<<getName(); 
    

  public: string getName() return this->name;  //return current obj's name value (getter method)

;

int main()

    Animal a1;
    //cout<<a1.getName(); //it will get the name of a1's object
    return 0;

【讨论】:

【参考方案3】:
 #include <iostream>
using namespace std; //Don't kill me

class animal

private:

    char name [20];
public:
    animal () //Constructor without parameters
    
        cout<<"Please enter animal name: ";
            cin>>name;
    

    void getAnimal();
;

void animal :: getAnimal()

    cout<<name; 


int main ()

animal a1;
     a1.getAnimal();

请记住,构造函数有 3 种类型。在这种情况下,您似乎必须使用一个需要参数的默认构造函数,因为它只是将 name 设置为默认值。要获取用户定义的值,您可以在构造函数中使用 cin。当您在 main 中创建对象并运行程序时,它将允许用户输入名称。 要阅读和打印名称,我发现 getter 方法更容易。 https://www.geeksforgeeks.org/constructors-c/

【讨论】:

以上是关于构造函数中的 Cin 和 cout的主要内容,如果未能解决你的问题,请参考以下文章

c++ cin返回值问题

派生类中的构造函数和析构函数

C++创建派生类对象时,调用构造函数顺序

dev_c++ 复制构造函数

C++子类构造函数调用的一个问题

构造函数的调用(其中不包括赋值构造函数)