构造函数中的 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:不正确。 \n
与 std::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的主要内容,如果未能解决你的问题,请参考以下文章