Я пытаюсь вывести в окно консоли свой вектор указателей, но все равно не работает. Я могу заполнить вектор, но когда я пытаюсь 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
и другие детали. Если эти части не имеют отношения к делу, удалите их из кода, который должен воспроизводить проблему. Убедитесь, что в вашем компиляторе включены все предупреждения.
Когда я устанавливаю точку останова на Dealer.push_back (новый CDealer (c)); Я вижу, что вектор заполнен, но в конце на консоли я вижу только m_strNameShop и m_strCity, когда я устанавливаю точку останова на while (it! = S.Dealer.end ()) {toStream << "Dealer" << * it ++; } вообще в него не входит.
У вас преждевременный 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, пожалуйста. Рад, что смог помочь.
Вы пробовали отладчик?