C ++如何在没有错误的情况下调用void函数?

时间:2019-02-20 13:06:50

标签: c++

这是我选择的一项工作,但是我不确定如何解决我在cout << contact.getInformation() << endl;收到的错误消息,而没有将Void函数更改为其他类型或更改main函数(我正在努力避免)。我认为我缺乏理解是cout和void函数如何协同工作。我试图从函数中删除cout,但是那没有用,并且使代码运行的唯一方法是将cout << contact.getInformation() << endl;替换为contact.getInformation(),这是我想避免的。我只想在调用cout << contact.getInformation() << endl;时打印void函数的内部 欢迎任何帮助!谢谢!

#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

class Contact{

public:
    Contact(int id, string name, string telephone, int age)
    : _id{ id }, _name{ name }, _telephone{ telephone }, _age{ age } {}

    int id() { return _id; }
    string name() { return _name; }
    string telephone() { return _telephone; }
    int age() { return _age; }

    void getInformation() {
        cout << "ID: " + to_string(_id) + "\n" +
        "NAME: " + _name + "\n" +
        "TEL: " + _telephone + "\n" +
        "AGE: " + to_string(_age) + "\n";
    }
private:
    int _id;
    string _name;
    string _telephone;
    int _age;

};

int main() {
    Contact contact{1, "Michael", "555-555-5555", 15};
    cout << contact.getInformation() << endl;
}. 

编辑:谢谢大家!我现在看到这些限制是不可能的。

3 个答案:

答案 0 :(得分:6)

您提供的代码有很多问题。如果您读了一些不错的C ++书籍,就可以避免使用它们,我的建议是Scott Meyers有效的C ++:55种改善程序和设计的特定方法。

    除非确实有必要,否则不要使用using指令。在大多数情况下,对于std名称空间-并非如此。
  1. 通过引用/ const引用而不是通过值或指针传递非原始类型的函数参数
  2. 了解const关键字及其用法
  3. 了解构造函数的静态初始化步骤
  4. 了解c ++流

这是您的代码外观:

#include <iostream>
#include <string>

class Contact {

public:
    Contact(int id,const std::string& name,const std::string& telephone, int age):
        _id( id ),
        _name( name ),
        _telephone( telephone ),
        _age( age )
    {}

    int id() const {
        return _id;
    }
    std::string name() const {
        return _name;
    }
    std::string telephone() const {
        return _telephone;
    }
    int age() const {
        return _age;
    }


private:
    int _id;
    std::string _name;
    std::string _telephone;
    int _age;

};

std::ostream& operator<<(std::ostream& to,const Contact& c)
{
    to << "ID: " << c.id() << '\n';
    to << "NAME: " << c.name() << '\n';
    to << "TEL: " << c.telephone() << '\n';
    to << "AGE: " << c.age() << '\n';
    to.flush();
    return to;
}

int main(int argc, const char** argv)
{
    Contact contact = {1, "Michael", "555-555-5555", 15};
    std::cout << contact << std::endl;

    return 0;
}

答案 1 :(得分:5)

您的要求是不可能的。您已设置的两个条件(即1.请勿将void函数更改为另一种类型,以及2.请勿更改main方法)使得无法以其他方式更改您的代码,以使main函数产生预期的结果。

您可以任一将您的void函数更改为返回“可打印”内容的函数,例如字符串,您可以将void函数直接打印为cout,但是可以更改主函数以在cout <<构造上下文之外自行调用它。

(或者,最好也如注释中所指出的那样,使<<运算符重载以使其无效,而不是使之无效)

答案 2 :(得分:4)

getInformation这个名称表明它应该获取信息,而不是打印信息。

因此,您可能想要这样:

  string getInformation() {
    return  "ID: " + to_string(_id) + "\n" +
      "NAME: " + _name + "\n" +
      "TEL: " + _telephone + "\n" +
      "AGE: " + to_string(_age) + "\n";
  }

代替此:

  void getInformation() {
    cout << "ID: " + to_string(_id) + "\n" +
      "NAME: " + _name + "\n" +
      "TEL: " + _telephone + "\n" +
      "AGE: " + to_string(_age) + "\n";
  }

无法更改maingetInformation