【问题标题】:C++, container vector of pointers, overloading operator<<C++,指针的容器向量,重载运算符<<
【发布时间】:2018-05-01 19:38:29
【问题描述】:

我正在尝试将我的指针向量取出到控制台窗口,但仍然无法正常工作。我可以填充向量,但是当我尝试 cout

这是带有私有类成员和函数声明的头文件:

#pragma once
#include"CDealer.h"
#include<vector>
#include<fstream>
#include<iterator>
    class CShop
    {
    public:
        CShop();
        ~CShop();
        CShop(const string &fname);
        friend ostream &operator << (ostream &toStream, const CShop &S);
        friend istream &operator >> (istream &fromStream, CShop &S);

    private:
        string m_strNameShop;
        string m_strCity;
        vector<CDealer*> Dealers;

    };

这是我的构造函数,其中包含我带来数据的文件

#include "CShop.h"

CShop::CShop(){}
CShop::~CShop(){}

        CShop::CShop(const string &fname)
    {
        fstream File(fname, ios::in);
        if (File.is_open())
        {
            CDealer c;
            File >> m_strNameShop;
            File >> m_strCity;

            while (File.is_open())
            {
                File >> c;
                Dealers.push_back(new CDealer(c));
            }
            File.close();   
        }
        else
            throw "ERROR! ";
    }

这是重载运算符

    ostream &operator << (ostream &toStream, const CShop &S)
{
    return toStream << "Name Shop: " << S.m_strNameShop << " City: " << S.m_strCity;

    vector<CDealer *>::const_iterator it = S.Dealers.begin();
    while (it != S.Dealers.end())
    {
        toStream << "Dealer " << *it++;
    }

}

所以最后我的主

#include"CShop.h"
#include<iostream>
#include<string>
#include <stdlib.h>  
#include<vector>
using namespace std;

int main()

{
    CShop SS1("data.txt");
        cout << SS1;
        system("pause");
        return 0;   

请帮帮我:)

【问题讨论】:

  • 你试过调试器吗?
  • 当我复制并粘贴这段代码时,它不会编译。似乎缺少#include 和其他部分。如果这些部分不相关,请将它们从应该重现问题的代码中删除。确保您在编译器中启用了所有警告。
  • 当我在 Dealers.push_back(new CDealer(c)) 上设置断点时;我可以看到向量已填充,但最后在控制台上我只能看到 m_strNameShop 和 m_strCity,当我在 while (it != S.Dealers.end()) { toStream

标签: c++ vector stl


【解决方案1】:

你在函数中有一个过早的return

 return toStream << "Name Shop: " << S.m_strNameShop << " City: " << S.m_strCity;
 //^^^

删除它。

toStream << "Name Shop: " << S.m_strNameShop << " City: " << S.m_strCity;

在函数结束前添加return

std::ostream& operator<<(std::ostream& toStream, const CShop &S)
{
   toStream << "Name Shop: " << S.m_strNameShop << " City: " << S.m_strCity;

   vector<CDealer *>::const_iterator it = S.Dealers.begin();
   while (it != S.Dealers.end())
   {
      toStream << "Dealer " << *it++;
   }

   return toStream;
}

进一步改进的建议。

线

      toStream << "Dealer " << *it++;

将仅打印指针值。如果要打印指针指向的对象的详细信息,请将其更改为:

      Dealer* dealerPtr = *it++;
      toStream << "Dealer " << *dealerPtr;

下面的块是不正确的。 File.is_open() 在此块中将始终为 true

 while (File.is_open())
 {
    File >> c;
    Dealers.push_back(new CDealer(c));
 }

改成:

 while (File >> c)
 {
    Dealers.push_back(new CDealer(c));
 }

【讨论】:

  • @Kristiyan,不客气。很高兴我能提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 2021-05-31
  • 2021-07-02
  • 1970-01-01
相关资源
最近更新 更多