Форум программистов, компьютерный форум CyberForum.ru

Почему дружественная функция с перегруженным оператором << не имеет доступа к данным класса? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ нахождение Максимальной длины имени объекта Fat32 http://www.cyberforum.ru/cpp-beginners/thread359682.html
Прошу помощи,подсказки в решении такой вот задачки(С++Borland3.1) поиск объектов с максимальным количеством символов в имени среди объектов с длинными именами для FAT максимальное к-во-255 символов,это 20 дескрипторов по 13 симв неясно вот к примеру код LFN-0х0F,а какой код max LFN или его надо просчитывать,может кто сталкивался с подобной задачкой
C++ C++ Наследование динамического списка классом стеком. Салют форумчане. Новый курс, новые приключения. Вот и дали задание наследую динамический список создать стек. Список вроде сделал , да стек не пойму как к нему прикрутить. (Какие только велосипеды не придумают для лабораторных работ) List.h #ifndef LIST_H #define LIST_H #include <iostream> using std::cout; #include <new> #include "ListNode.h" template< typename NODETYPE > http://www.cyberforum.ru/cpp-beginners/thread359680.html
Литература по структурам данных и алгоритмам C++
Доброго Времени Суток! Хочу спросить совета, по поводу обширной книги по структурам данных и алгоритмам на C++. Отыскал следующие книги: 1. Организация структур данных и решение задач на С++, Уайс М. А. 2. Структуры и алгоритмы обработки данных: объектно-ориентированный подход и реализация на С++, А. А. Кубенский 3. Структуры и алгоритмы обработки данных. Примеры на языке Си, Б. С....
Перестановка строки. C++
#include <iostream> using namespace std; void change(char &a, char &b); void permutation(char* Str) { if(strlen(Str)%2 == 0)
C++ Объясните код программы http://www.cyberforum.ru/cpp-beginners/thread359647.html
Вот рабочий код) напротив каждой строки через 2 слеша обьясните что происходит в программе, желательно поподробнее) спасибо) #include <stdafx.h> #include <iostream> #include <algorithm> #include <string> #include <vector> using namespace std; class Csv { // read and parse comma-separated values
C++ Написать функцию is_equal() - поэлементное сравнение двух контейнера C++ Реализуйте следующую функцию: bool is_equa1( const int*ia, int ia_size,const vector<int> &ivec ); Функция is_equal() сравнивает поэлементно два контейнера. В случае разного размера контейнеров “хвост” более длинного в расчет не принимается. Понятно, что, если все сравниваемые элементы равны, функция возвращает true, если отличается хотя бы один – false. Используйте итератор для перебора... подробнее

Показать сообщение отдельно
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.10.2011, 02:36  [ТС]     Почему дружественная функция с перегруженным оператором << не имеет доступа к данным класса?
Цитата Сообщение от ForEveR Посмотреть сообщение
alsav22, Книга для новичков. Я ведь говорю это более высокие материи. Просто запомните, что в хедере так писать не стоит, а пока пишете учебные программы - пишите сколько хотите.

ЗЫ Не компилировалось без using namespace std потому что без использования using нужно указывать квалификатор namespace явно, т.е. std::cout, std::string и т.д. или писать using std::cout и затем уже просто cout. Последнее тоже не советую делать в хедере.
Согласен, что книга как раз для меня. А насчёт компиляции... Ведь когда возникала ошибка, using namespace std; отсутствовал только в хедер - файле, в котором не было ни cout, ни сin ... Такой был h-файл:
class klass
{
int x;
public:
klass();
~klass();
void show();
friend void operator<<(ostream& a, const klass& b);
};

Где тут, что явно указывать? А в остальных файлах using namespace std; присутствовал, а компиляциия, тем не менее, не проходила. Только после прописывания using namespace std; в хедер - файле ошибка исчезает.
Мне кажется, что всё это из за этого: ostream&. Если его нет, то компилируется и без
#include <iostream>, и без using namespace std; в хедер - файле.

Добавлено через 1 час 18 минут
Сейчас попробовал другим компилятором (Dev C++). То же самое. Пока не пропишу using namespace std; в h-файле, не компилируется. Выдаёт, в частности, это:
...
13 D:\Dev-Cpp\Dev-Cpp\klass.h ISO C++ forbids declaration of `ostream' with no type
13 D:\Dev-Cpp\Dev-Cpp\klass.h `ostream' is neither function nor member function; cannot be
13 D:\Dev-Cpp\Dev-Cpp\klass.h parse error before `&' token
...
После прописки, даже без #include <iostream> в h-файле, компилируется без ошибок.

Добавлено через 31 минуту
Нашёл, что можно явно указать в h-файле. Удалить из h-файла using namespace std; , а в прототипе функции явно указть: friend std::ostream& operator<<(std::ostream& ss, const klass& u); .
VC++ 2010 и Dev C++ компилируют без ошибок, НО, VC++ 2010, в файле реализации этой функции:
ostream& operator<<(ostream& ss, const klass& u)
{
ss << u.x;
return ss;
}
подчёркивает x, подсказка, что член класса недоступен (using namespace std; в этом файле прописан). С чего всё и началось. И, только если и тут явно указать std::ostream&, то подчёркивание исчезает.
Одним словом - заморочка.

Добавлено через 39 минут
А насчёт прописывания using namespace std; в заголовочном файле, я знаю, что это не желательно, потому что тогода эта директива будет присутствовать во всех файлах, а использование этой директивы не рекомендуется. Но в данном случае, когда в h-файле я пробовал указывать явно std::ostream& , в файле реализации этой функции не исчезало подчёркивание x, а компилировать при этом я не пытался, считая, что если есть подчёркивание, то компиляция будет с ошибкой. Оказалось, что это не всегда так. Опыт приходит с годами. Благодарю за помощь!
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru