如何打印对象矢量?

时间:2018-10-06 08:46:33

标签: c++ object pointers for-loop vector

我猜想我可能必须使用指针,但是在课堂上还没有深入探讨它们,以尝试在程序中实现它们。到目前为止,我的打印功能已接近程序的中间位置。我不确定如何从向量中打印出元素,因为我的方法行不通。

$scope.$on("$locationChangeStart", function(event, newUrl) {
    event.preventDefault();
    if (confirm("You have unsaved changes. Are you sure you want to leave this page without saving?")) {
        $location.path($location.url(newUrl).hash());
    }
});

2 个答案:

答案 0 :(得分:1)

πάνταῥεῖ是正确的,但要添加更多细节...

您需要指定希望流如何处理对象的方式。通过添加<<运算符可以完成此操作。例如:

std::ostream& operator<<(std::ostream& s, const rolodex& r){
  // Or however you want to format it.
  s << "Name: " << r.name << " : ";
  s << "Street: " << r.street << " : ";
  s << "Town: " << r.town << " : ";
  s << "State: " << r.state << " : ";
  s << "Zip: " << r.zip << "\n";
}

不幸的是,上面的函数试图访问您的类的私有字段,但不能,因为它不是类定义的一部分。

一种简单的解决方法是在类定义内部将这个函数声明为“朋友”,例如:

 friend std::ostream& operator<<(std::ostream&, const rolodex&);

...由于您可能会喜欢它,因此可以直接使用一个大的可复制粘贴的块使您的功能正常工作

class rolodex
{
  string name;
  string street, town, state;
  string zip;
  string phone;
  vector <rolodex> entries;

  public:
     rolodex();
     void getmenu();
     void add_entry();
     void set_name();
     void set_address();
     void set_phone();
     void printinfo();

     friend std::ostream& operator<<(std::ostream&, const rolodex&);
};

std::ostream& operator<<(std::ostream& s, const rolodex& r){
  // Or however you want to format it.
  s << "Name: " << r.name << " : ";
  s << "Street: " << r.street << " : ";
  s << "Town: " << r.town << " : ";
  s << "State: " << r.state << " : ";
  s << "Zip: " << r.zip << "\n";
}

答案 1 :(得分:1)

按照πάνταῥεῖ的建议,这是一种实现方法,尽可能少地更改设计:

1)为rolodex类创建一个非成员重载运算符<<:

std::ostream& operator<< (std::ostream& os, const rolodex& rol)
{
    os << rol.name << ":"    << std::endl
       << "\t" << rol.street << std::endl
       << "\t" << rol.town   << std::endl
       << "\t" << rol.state  << std::endl
       << "\t" << rol.zip    << std::endl
       << "\t" << rol.phone  << std::endl;
    return os;
}

..,但是编译器会责备您尝试从类外部访问私有成员(默认情况下,成员是私有的),因此您将需要放宽规则:

class rolodex
{
  ...
public:
     ...
     friend std::ostream& operator<< (std::ostream& os, const rolodex& rol);
};

您不能在类本身内部包含运算符<<,请参见does-overloading-operator-works-inside-the-class

但是,无论如何,将getter函数添加到公共接口中几乎总是更好的设计。您将在类def的get_name()部分中拥有public:等,这些函数最初只会返回私有成员变量的值,然后您的operator <<可以使用它们而不是尝试访问私人成员。然后,您不再需要friend声明。

我赞成一些程序员哥关于您设计的评论

用于让用户输入数据的代码实际上不应该放在rolodex类内部,因为它使类难以重用。例如,图像想通过图形界面重新使用rolodex,而让rolodex在向量中包含其自身的实例并不是一个好主意。

我建议

1)包含所有人员属性的人员类,具有不使用特定输入方法的公共获取器get_name()和设置器set_name(),只需将数据作为参数即可,例如set_name(std::string& name)

2)非成员运算符<<,用于将人输出到输出流

3)一个带有私有std::vector<Person>的Rolodex类,以及添加人员,将所有人员写入输出流的方法,等等。

祝你好运并享受:-)

编辑:终端上的菜单结构应恕我直言放在main()函数内部或封装到另一个类中。但是,当然,不要把它留在Rolodex或更糟的地方了,