Просто попал в C ++ и у меня есть быстрый вопрос.
После компиляции с
g++ *.cpp -o output
Я получаю эту ошибку:
error: 'ostream' in 'class Dollar' does not name a type
Это мои три файла:
main.cpp
#include <iostream>
#include "Currency.h"#include "Dollar.h"
using namespace std;
int main(void) {
Currency *cp = new Dollar;
// I want this to print "printed in Dollar in overloaded << operator"cout << cp;
return 0;
}
Dollar.cpp
#include <iostream>
#include "Dollar.h"
using namespace std;
void Dollar::show() {
cout << "printed in Dollar";
}
ostream & operator << (ostream &out, const Dollar &d) {
out << "printed in Dollar in overloaded << operator";
}
Dollar.h
#include "Currency.h"
#ifndef DOLLAR_H
#define DOLLAR_H
class Dollar: public Currency {
public:
void show();
};
ostream & operator << (ostream &out, const Dollar &d);
#endif
Спасибо за ваше время, и все помогает!
У вас есть несколько ошибок в коде.
using namespace std
, Это плохая практика. В частности, это привело к ошибке, с которой вы столкнулись: у вас нет using namespace std
в Dollar.h
Таким образом, компилятор понятия не имеет, что ostream
средства. Либо поставить using namespace std
в Dollar.h
тоже, или лучше просто прекратить использовать его и указать std
пространство имен напрямую, как в std::ostream
,std::ostream
в ваших заголовках, но вы не включаете соответствующий стандартный заголовок библиотеки <ostream>
в них (<ostream>
содержит определение std::ostream
учебный класс; для полной библиотеки ввода / вывода включить <iostream>
). Хорошей практикой является включение всех зависимостей заголовка в сам заголовок, чтобы он был автономным и мог быть безопасно включен где угодно.std::ostream & operator << (std::ostream &, Dollar const &)
, что совершенно справедливо. Тем не менее, вы называете это для указатель печатать Dollar
, Вы должны скорее назвать это с объект сам по себе, а не указатель, поэтому вы должны разыменовать указатель: std::cout << *cp;
,Вы реализовали оператор вывода для Dollar
класс, но используйте его для переменной типа Currency
: это не сработает. Есть способ сделать это — существуют виртуальные методы именно по этой причине. Однако в этом случае оператор является свободной функцией, поэтому он не может быть виртуальным. Итак, вам, вероятно, следует добавить виртуальный print
метод к вашему Currency
класс, реализовать его в Dollar
и вызвать его из оператора вывода:
#include <iostream>
class Currency {
public:
virtual void print (std::ostream &) const = 0;
};
class Dollar : public Currency {
void print (std::ostream & out) const override {
out << "A dollar";
}
};
std::ostream & operator << (std::ostream & out, Currency const & c) {
c.print(out);
return out;
}
int main(/* void is redundant here */) {
Currency *cp = new Dollar;
std::cout << *cp;
// return 0 is redundant in main
}
Вам нужно #include <iostream>
в пределах Dollar.h, чтобы ваш std::ostream & operator
разрешается компилятором.