【问题标题】:c++: I am not getting the right output (Noob Question)c++:我没有得到正确的输出(菜鸟问题)
【发布时间】:2020-03-21 07:45:51
【问题描述】:

所以我对 C++ 非常陌生,我正在处理流和成员函数。我正在尝试使用传递给我的类的值来获得输出,但我没有得到正确的值。相反,我得到了像这样的垃圾值:

( this is the name: , and this is the age: 3223232)

在输出中。这是我的代码:

#include <iostream>
using namespace std;

class Person{
    string name;
    int age;
    public:
    ostream& print_on(ostream &o) {
        return o << '( this is the name: ' << name << ', and this is the age: ' << age << ')';
    }
        Person(){
            name="noname";
            age=0;
        }
        Person(string name, int age){
            name=name;
            age=age;
        }
        void setName(string n) {
        name=n;
        }
        string getName() {
         return name;
        }
        void setAge(int a){
            age=a;
        }
        int getAge(){
            return age;
        }
        friend ostream& operator << (ostream &output,Person &p);
};
 ostream& operator << (ostream &output, Person &p){
     return p.print_on(output);
 }

int main()
{
   string name="Helen";
    int age=24;

       Person p(name,age);
       cout<<p;

    return 0;
}

【问题讨论】:

  • 翻到书中关于成员初始化列表的部分。
  • return o &lt;&lt; '( this is the name: ' 等是一个错误,它应该是字符串周围的双引号。如果您没有收到关于此的编译器警告或错误,请调整您的设置

标签: c++ constructor scope initialization ostream


【解决方案1】:

在这个构造函数定义中

    Person(string name, int age){
        name=name;
        age=age;
    }

参数隐藏同名类的数据成员。

改为写例子

    Person(string name, int age){
        this->name=name;
        this->age=age;
    }

或者

    Person(string name, int age){
        Person::name=name;
        Person::age=age;
    }

或者更好的方法是写

    Person( const string &name, int age ) : name( name ), age( age )
    {
    }

考虑到您需要包含标题&lt;string&gt;

#include <string>

不改变类对象的成员函数也应该声明为常量函数。例如

ostream& print_on(ostream &o) const
{
    //…
}

同样在友元运算符的第二个参数也应该有限定符 const

friend ostream& operator << (ostream &output, const Person &p);

【讨论】:

  • 我会避开构造函数中的const std::string&amp;,因为要么您要存储引用并且人们需要考虑对象的生命周期,要么无论如何都需要制作副本。还不如直接使用std::string name
  • @Tas 这是常用的方法。
【解决方案2】:

这段代码:

    Person(string name, int age){
        name=name;
        age=age;
    }

错了,你给自己赋值。

试试:

    Person(string p_name, int p_age){
        name = p_name;
        age = p_age;
    }

【讨论】:

  • 小记:如果你使用成员初始化器列表来初始化它们,使用相同的名称是完全可以接受的,但老实说,使用不同的名称无论如何都会更有意义,并且是一个值得养成的习惯。跨度>
【解决方案3】:

问题就在这里

Person(string name, int age){
  name=name;
  age=age;
}

您没有设置类变量,而是尝试将参数设置为等于它们自己。要设置此人的姓名和年龄,您必须使用this 关键字,如下所示:

Person(string name, int age) {
  this->name=name;
  this->age=age;
}

【讨论】:

  • @Tas 你是对的,this-&gt; 应该在那里使用,我会编辑我的答案,谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
相关资源
最近更新 更多