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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
#1

Друзья класса - C++

12.02.2013, 15:40. Просмотров 719. Ответов 9
Метки нет (Все метки)

В классе объявлены такие прототипы
C++
1
2
friend ostream &operator<< (ostream &, const Complex &);
friend istream &operator>> (istream &, Complex &);
и private поля
C++
1
2
double real;
double imaginary;
Но когда я начинаю писать метод

C++
1
2
3
4
5
ostream &operator<< (ostream &output, const Complex &ourNum)
{
    output << '(' << ourNum.real << ',' << ourNum.imaginary << ')' << endl;
    return output;
}
то пишет, что real и imaginary не доступно. Но ведь функции объявлены как друзья
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12675 / 7183 / 801
Регистрация: 27.09.2012
Сообщений: 17,708
Записей в блоге: 2
Завершенные тесты: 1
12.02.2013, 16:03     Друзья класса #2
копипаст:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Complex{
private:
    friend ostream &operator<< (ostream &, const Complex &);
friend istream &operator>> (istream &, Complex &);
double real;
double imaginary;
};
 
ostream &operator<< (ostream &output, const Complex &ourNum)
{
    output << '(' << ourNum.real << ',' << ourNum.imaginary << ')' << endl;
    return output;
}
все работает. Ищите ошибку!!!
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 16:10  [ТС]     Друзья класса #3
Вот полный код, очень похож на ваш, но не работает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma once
class Complex
{
    friend ostream &operator<< (ostream &, const Complex &);
    friend istream &operator>> (istream &, Complex &);
public:
    Complex(double = 0.0, double = 0.0);
    Complex operator+(const Complex &) const;
    Complex operator-(const Complex &) const;
    Complex operator*(const Complex &) const;
    Complex &operator=(const Complex &);
    void print() const;
    ~Complex(void);
private:
    double real;
    double imaginary;
};
 
ostream &operator<< (ostream &output, const Complex &ourNum)
{
    output << '(' << ourNum.real << ',' << ourNum.imaginary << ')' << endl;
    return output;
}
Добавлено через 4 минуты
Кстати, скопипастил ваш код, точно также подчеркивает красным real и imaginary. Просто компилятор может не сразу отреагировать, у меня после копипасты секунды 2-3 ещё всё нормально.
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
12.02.2013, 16:25     Друзья класса #4
Сдается мне, вы говорите о чем-то навроде IntelliSense?
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 17:17  [ТС]     Друзья класса #5
Без понятия о чем вы вообще говорите.

Добавлено через 44 минуты
Ну, я уже даже отдельно создал несколько раз, предоставленный модератором код не компилируется, так как части real и imaginary не доступны.
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
12.02.2013, 18:10     Друзья класса #6
kebal, только что вставил твой код себе в VS2012, у меня всё норм. (real и imaginary доступны.) Выложи весь код программы.
ya_noob
_
201 / 145 / 9
Регистрация: 08.10.2011
Сообщений: 432
12.02.2013, 18:12     Друзья класса #7
Цитата Сообщение от SeregaC++ Посмотреть сообщение
а зачемь ты операторы ввода и вывода сделал приватными?
спецификаторы доступа не действуют на дружественные функции
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 18:26  [ТС]     Друзья класса #8
Та даже вот такой банальный пример не компилирует
Файл Complex.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdafx.h"
#include "Complex.h"
#include <iostream>
using namespace std;
 
Complex::Complex(void)
{
}
 
 
Complex::~Complex(void)
{
}
А вот файл Complex.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#pragma once
 
class Complex{
    Complex();
    ~Complex();
private:
friend ostream &operator<< (ostream &, const Complex &);
friend istream &operator>> (istream &, Complex &);
double real;
double imaginary;
};
 
ostream &operator<< (ostream &output, const Complex &ourNum)
{
    output << '(' << ourNum.real << ',' << ourNum.imaginary << ')' << endl;
    return output;
}
Добавлено через 1 минуту
А вот что выдает сам компилятор при построении решения
1>------ Построение начато: проект: new, Конфигурация: Debug Win32 ------
1> stdafx.cpp
1> new.cpp
1> Complex.cpp
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(7): error C2143: синтаксическая ошибка: отсутствие ";" перед "&"
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(7): error C2433: ostream: "friend" не разрешается для объявлений данных
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(7): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(7): error C2061: синтаксическая ошибка: идентификатор "ostream"
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(7): error C2805: бинарный "operator <<" имеет слишком мало параметров
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(8): error C2143: синтаксическая ошибка: отсутствие ";" перед "&"
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(8): error C2433: istream: "friend" не разрешается для объявлений данных
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(8): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(8): error C2061: синтаксическая ошибка: идентификатор "istream"
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(8): error C2805: бинарный "operator >>" имеет слишком мало параметров
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(13): error C2143: синтаксическая ошибка: отсутствие ";" перед "&"
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(13): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(13): error C2086: int ostream: переопределение
1> c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(7): см. объявление "ostream"
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(13): error C2065: output: необъявленный идентификатор
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(13): error C2059: синтаксическая ошибка: const
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(14): error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
1>c:\users\admin\documents\visual studio 2012\projects\new\new\complex.h(14): error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)
1> Создание кода...
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
12.02.2013, 18:35     Друзья класса #9
подключи хотя бы в .h файл библиотеки.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2013, 18:42     Друзья класса
Еще ссылки по теме:

C++ подскажите новичку добрые друзья(
Функция-друзья и внутриклассовые типы данных C++
Друзья класса C++
Друзья шаблонного класса. Использование вложенной в класс структуры C++
C++ Дружественные виртуальные функции друзья

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 18:42  [ТС]     Друзья класса #10
Это фейл. Понятно Я думал, что оно распространяется из .cpp
ужас просто, такую глупость допустить Просто обычно если не из библиотеки, то оно подсвечивается красным, вот я никак и не подумал, что в этом дело, новичок...
Yandex
Объявления
12.02.2013, 18:42     Друзья класса
Ответ Создать тему
Опции темы

Текущее время: 04:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru