使用std :: ostream打印矢量

时间:2015-12-15 01:31:22

标签: c++ vector ostream

我对C ++很陌生,我正在尝试打印出一系列机构,这是我创建的一种对象。对象的创建和我程序的其余部分运行得很好但是当我尝试打印出矢量时,"<<"给出一个错误,表示"操作数类型是std :: ostream"。

void PrintVector(const vector<Institution> &institutions)
{
    for (int x = 0; x < institutions.size; x++)
    {
        cout << institutions.at(x) << endl;
    }
}

我曾尝试研究std :: ostream是什么或它做了什么,但由于我不太了解C ++(或一般的编程),我无法理解任何解释它的网站。为什么赢得了通常的&#34; cout&lt;&lt;&#34;在这种情况下工作?任何人都可以向我解释这意味着什么,或者是否有不同的方法来打印我的矢量并不需要这个?

感谢任何帮助,谢谢。

6 个答案:

答案 0 :(得分:4)

您可能希望为您的类机构重载ostream运算符(&lt;&lt;); https://msdn.microsoft.com/en-us/library/1z2f6c2k.aspx

ostream& operator<<(ostream& os, const Institution& inst)
{
    os << inst.foo; /* some member variable */;
    return os;
}

答案 1 :(得分:1)

问题是C ++ ostreamcout是)没有任何方法可以打印出Institution个对象。您将不得不重载operator<<中的Institution函数,如其他答案(https://msdn.microsoft.com/en-us/library/1z2f6c2k.aspx?f=255&MSPPError=-2147217396)中发布的链接所述,以使其正常工作。

答案 2 :(得分:1)

您必须为您的班级提供operator <<

std::ostream& operator << (std::ostream& os, const Institution& institution)
{
    os << institution.getValue();
    // ...
    return os;
}

答案 3 :(得分:1)

operator<<已重载,以允许输出内置类型,例如intdouble。但是你需要通过再次重载它来告诉编译器如何输出你的类Institution

std::ostream& operator<<(std::ostream& os, const Institution& inst) {
    os << inst.name(); // or something
    return os;
}

答案 4 :(得分:0)

您所显示的代码至少存在两个问题。

1)

for (int x = 0; x < institutions.size; x++)

std :: vector :: size()是一个类方法,一个函数。它不是班级成员。这应该是:

for (int x = 0; x < institutions.size(); x++)

2)

cout << institutions.at(x) << endl;

不幸的是,std::ostream对您的Institution课程一无所知。您将需要实现一个类方法,例如display(),它将组合类的内容的可打印表示,并将其写入输出流。因此,例如,如果该类包含两个std::string,称为nameaddress

class Institution {

// ...

public:

      void display(std::ostream &o)
      {
           o << name << std::endl << address << std::endl;
      }
// ...
};

...或者,无论您希望显示类实例的格式如何。然后:

for (int x = 0; x < institutions.size(); x++)
     institutions.at(x).display(std::cout);

3)

嗯,这是您的代码的额外问题。它实际上是用几十年前过时的过时C ++方言编写的。无论你用什么教科书来学习C ++,你都需要抛弃它,然后拿起一本本世纪写的教科书,它将教你现代的C ++。在现代C ++中,这变得更具可读性:

for (const auto &institution:institutions)
     institution.display(std::cout);

答案 5 :(得分:0)

这里的答案都是正确的。我将对显示问题提供略有不同的答案,因为这是一个反复出现的问题。你可以做的是定义一个抽象类,我们称之为IDisplay,它声明一个纯虚函数std::ostream& display(std::ostream&) const并声明operator<<为朋友。然后,您希望显示的每个类都必须从IDisplay继承,然后实现display成员函数。这种方法重用了代码,非常优雅。示例如下:

#include <iostream>

class IDisplay
{
private:
    /**
    * \brief Must be overridden by all derived classes
    *
    * The actual stream extraction processing is performed by the overriden
    * member function in the derived class. This function is automatically
    * invoked by friend inline std::ostream& operator<<(std::ostream& os,
    * const IDisplay& rhs).
    */
    virtual std::ostream& display(std::ostream& os) const = 0;

public:
    /**
    * \brief Default virtual destructor
    */
    virtual ~IDisplay() = default;

    /**
    * \brief Overloads the extraction operator
    *
    * Delegates the work to the virtual function IDisplay::display()
    */
    friend inline
    std::ostream& operator<<(std::ostream& os, const IDisplay& rhs)
    {
        return rhs.display(os);
    }
}; /* class IDisplay */

class Foo: public IDisplay
{
public:
    std::ostream& display(std::ostream& os) const override 
    {
        return os << "Foo";
    }
};

class Bar: public IDisplay
{
public:
    std::ostream& display(std::ostream& os) const override 
    {
        return os << "Bar";
    }
};

int main() 
{
    Foo foo;
    Bar bar;
    std::cout << foo << " " << bar;    
}

Live on Coliru