使用课程但无法显示答案。

时间:2015-10-29 18:23:30

标签: c++ class operator-overloading

我真的不想写这个问题,但我似乎无法输出这个名字。这是我班级任务的一部分,这是任务中最难的部分,但我的老师说我们可以得到帮助并问别人,只要我们真正了解和理解我们在做什么以及为什么我们这样做它。所以我要求这个帮助我理解为什么我的程序不输出人名。

我想做的是;输入一个名字" lEonArDo DA vINCi"其中包含UPPER和小写字母,以及它们诞生的日期" 1520",然后有代码将名称变为小写并且仅将单词中的第一个字母大写,最后输出那个名字。

我所坚持的是输出名字。我无法弄清楚我做错了什么。我在班上问过其他人,但是他们在第一部分仍然是以太,或者他们在某种程度上坚持这个问题。

class Person{ //Can't change from here.
public:
    Person(string n, int year) : name(n), yearOfBirth(year){}
    string getName();
    friend ostream& operator <<(ostream&, const Person&);
private:
    string name; int yearOfBirth;
}; // to here.

string Person::getName() //output the name
{
    // I think the output should be here but it doesn't work.
    // I have also switched the code in the operator into the getName put it still doesn't work.
    return name;
}

ostream& operator << (ostream& output, const Person& P){ //turns everything into lowercase.
    locale loc;
    string temp = ""; //well be asigning the lowercase letters here; one at a time.
    int ii = 0;
    for (string::size_type i = 0; i < P.name.length(); i++) { //reads the input one at a time.
        if ((ii == 0) || (ii >= 1 && ((P.name[i - 1]) == char(32)))) {(toupper(P.name[i], loc), (temp += toupper(P.name[i], loc))); }//if it was lowercase and the first letter, it turns it into uppercase and assigns it to temp.
        else (tolower(P.name[i], loc), (temp += tolower(P.name[i], loc))); //if it was uppercase it turns it into lowercase and assigns it to temp.
        ii++;
    } //name = temp; //assigns the full lowercase word back to input01.*/
    output << temp << " was born in " << P.yearOfBirth;
    return output;
}

int main(){
    Person::Person("lEonArDo DA vINCi", 1520);
    // I have tried putting a output statement here as well
    return 0;
}

所以,我的问题是;我该如何输出名字? (即cout。)我需要在哪里输出输出语句? (在getName中或在main函数中。)即使你能告诉我一个模糊的答案它应该对我有多大帮助。 很抱歉不得不提出一个愚蠢的问题,并浪费你的时间。

1 个答案:

答案 0 :(得分:0)

Person::Person("lEonArDo DA vINCi", 1520);

不会成为一个人。你想要的更像是

Person leonardo("lEonArDo DA vINCi", 1520);

这会生成一个名为leonardo的{​​{1}}类型变量,并使用Person对其进行初始化。然后可以使用"lEonArDo DA vINCi", 1520来访问此leonardo。例如,获取并打印名称

Person

或者,因为你已经有了&lt;&lt;超载,

std::cout << leonardo.getName() << std::endl;

使用运算符&lt;&lt;功能

您可能希望从&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; std::cout << leonardo <<std::endl; 构造函数的运算符。这种方式而不是存储破损的“lEonArDo DA vINCi”,您可以存储正确的版本并仅打印出&lt;&lt;&lt;&lt;&lt;&lt;运营商。这使得&lt;&lt;操作员更简单,只需在施工时进行一次修正,而不是每次打印都是如此。