С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/155: Рейтинг темы: голосов - 155, средняя оценка - 4.97
0 / 0 / 1
Регистрация: 04.12.2014
Сообщений: 143

Как исправить. Ошибка Е0265

22.09.2018, 16:37. Показов 30831. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Книга с которой взят код, страницы 142-143:
http://www.rulit.me/books/c-ba... 8-143.html

Ошибка (активно) E0265 член "C1::status" (объявлено в строке 10) недоступно Программа 11 Глава 12 О классах

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// Использование функции-"друга".
#include <iostream>
using namespace std;
 
const int IDLE = 0;
const int INUSE = 1;
class С2; // опережающее объявление
 
class C1 {
    int status; // IDLE если сообщение неактивно, INUSE если сообщение выведено на экран.
    //...
public:
    void set_status(int state);
    friend int idle(C1 a, C2 b);
}; class C2 {
    int status; // IDLE если сообщение неактивно, INUSE если сообщение выведено на экран.
    //...
public:
    void set_status(int state);
    friend int idle(C1 a, C2 b);
};
 
void C1::set_status(int state)
{
    status = state;
}
 
void C2::set_status(int state)
{
    status = state;
}
// Функция idle() - "друг" для классов C1 и C2.
int idle(C1 a, C2 b)
{
    if (a.status || b.status) return 0;
    else return 1;
}
 
int main()
{
    setlocale(LC_ALL, "RUS");
    C1 x;
    C2 y;
    x.set_status(IDLE);
    y.set_status(IDLE);
    if (idle(x, y)) cout << "Экран свободен.\n";
    else cout << "Отображается сообщение.\n";
    x.set_status(INUSE);
    if (idle(x, y)) cout << "Экран свободен.\n";
    else cout << "Отображается сообщение.\n";
    system("pause");
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.09.2018, 16:37
Ответы с готовыми решениями:

Ошибка E0144. Как исправить?
В моем учебнике (Шилдт Герберт C++: базовый курс ) написан вот этот код. При его запуске возникает ошибка E0144. Как решить эту проблему?...

Ошибка: С2027, как ее исправить?
Пишет: &quot;использование неопределенного типа Row&quot;-&gt;указывает на ошибку здесь: Row *r = new Row; #include&lt;iostream&gt; using...

Ошибка в методе, как исправить?
void Point::Read() { int _x,_y; cin&gt;&gt;&quot;(&quot;&gt;&gt;_x&gt;&gt;&quot;,&quot;&gt;&gt;_y&gt;&gt;&quot;)&quot;; SetX(_x); SetX(_y); } Вот метод класса Point, хотел вводить...

6
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
22.09.2018, 17:30
Компилятор не может разобраться с опережающим объявлением для класса C1 при компиляции
C++
1
    friend int idle(C1 a, C2 b);
Выход:
Сделайте 2 перегруженные функции (кстати тогда их можно сделать и методами класса)
C++
1
2
3
4
5
6
7
8
bool idle(C1 a)
{
    return a.status;
}
bool idle(C2 a)
{
    return a.status;
}
и обыкновенную функцию
C++
1
2
3
4
bool TotalIdle(C1 a, C2 b)
{
    return idle(a) || idle(b);
}
0
0 / 0 / 1
Регистрация: 04.12.2014
Сообщений: 143
22.09.2018, 17:54  [ТС]
Добавил обе конструкции, все равно пишет эту ошибку Е0265
Ошибка (активно) E0265 член "C1::status" (объявлено в строке 10) недоступно Программа 11 Глава 12 О классах
Ошибка (активно) E0265 член "C2::status" (объявлено в строке 16) недоступно Программа 11 Глава 12 О классах

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// Использование функции-"друга".
#include <iostream>
using namespace std;
 
const int IDLE = 0;
const int INUSE = 1;
class С2; // опережающее объявление
 
class C1 {
    int status; // IDLE если сообщение неактивно, INUSE если сообщение выведено на экран.
    //...
public:
    void set_status(int state);
    friend int idle(C1 a, C2 b);
}; class C2 {
    int status; // IDLE если сообщение неактивно, INUSE если сообщение выведено на экран.
    //...
public:
    void set_status(int state);
    friend int idle(C1 a, C2 b);
};
 
void C1::set_status(int state)
{
    status = state;
}
 
void C2::set_status(int state)
{
    status = state;
}
// Функция idle() - "друг" для классов C1 и C2.                                       
bool idle(C1 a)
{
    return a.status;
}
bool idle(C2 a)
{
    return a.status;
}
 
bool TotalIdle(C1 a, C2 b)
{
    return idle(a) || idle(b);
}
 
int main()
{
    setlocale(LC_ALL, "RUS");
    C1 x;
    C2 y;
    x.set_status(IDLE);
    y.set_status(IDLE);
    if (idle(x, y)) cout << "Экран свободен.\n";
    else cout << "Отображается сообщение.\n";
    x.set_status(INUSE);
    if (idle(x, y)) cout << "Экран свободен.\n";
    else cout << "Отображается сообщение.\n";
    system("pause");
    return 0;
}
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
22.09.2018, 17:55
Цитата Сообщение от Stig30rus Посмотреть сообщение
friend int idle(C1 a, C2 b);
C++
1
friend int idle(C1 a);
Аналогично во втором класса

А лучше сделайте их членами класса
C++
1
2
3
4
5
6
7
8
bool C1::idle()
{
    return status;
}
bool C2::idle()
{
    return status;
}
0
0 / 0 / 0
Регистрация: 28.10.2023
Сообщений: 13
12.11.2023, 21:38
1 ошибка возможно в сигнатурах функций. Вы объявили одну дружественную функцию, а пишете другую... Смотрите внимательней!!! Тогда скрытые поля недоступны.
2 опережающее объявление работает только с указателем или ссылкой. Для самого объекта надо тело. Хотя иногда срабатывает. Но как видите не всегда... и вобще как-то странно передавать в качестве параметра сам объекта а не константную ссылку на него. Напиши бы вы так возможно всё и работало бы. Но не факт опять же проверять надо. Дружественность иногда глючит... как VisualStudio.
Предлагать сделать методы доступа глупо. Потому что дружественные функции как раз и используются для того чтобы не писать геттреы, а потом их ещё и не юзать!!! Нет смысла. Ну и вобще написав постой геттер и сеттер смысл скрывать поле тогда? Объявите его public и проблемы не будет. Но вы же объявили его private очевидно чтобы не дать к нему доступ извне. Это и называется инкапсуляция. Вы его так инкапсулировали в объекте. И это хорошо. Но потом вам надо в некоторых случаях позволить доступ и вы объявляете дружественную функцию что тоже хорошо. Пока всё правильно. Но она почему-то не видит ваших полей доступных для неё. Очевидно потому что она не есть дружественная. Вот отсюда надо плясать. Вам очевидно надо выяснить почему она оказалась недружественной. Обычно это бывает из-за какой-то неточности которую вы допустили. Внимательность это наше всё! Смотрите, ищите, и вы найдёте. Вы хотите чтобы мы нашли? Нет уж вы сами постарайтесь... Но зато какое удовольствие получите когда найдете! Если вы устали сделайте перерыв. Решение потом само придёт правильное... Оно обычно как раз во время перерыва и приходит. Напряжение тем более излишнее блокирует мозговую активность снижает внимание. Попейте чайку, кофейку, или что вы там пьёте... И всё получится. Метод agile и scrum приводят к некачественному коду. Но не все это понимают. Или им просто не надо качественный код, главное скорость, а потом получаем запоротоые проекты, которые легче заново написать чем разобраться что там не так... Не ведитесь на поводу у таких лиц. Вы просто роете себе яму.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,208
12.11.2023, 21:54
(Только заметил, что это старая тема, но до корня проблемы так и не докопались.)

Цитата Сообщение от Stig30rus Посмотреть сообщение
class С2; // опережающее объявление
Здесь использована русская буква "C". Поэтому это опережающее объявление "не работает".

Цитата Сообщение от Stig30rus Посмотреть сообщение
Ошибка (активно) E0265 член "C1::status" (объявлено в строке 10) недоступно Программа 11 Глава 12 О классах
Не надо выдумывать. Нет в этом коде такой ошибки. Коды ошибок в компиляторе Visual Studio начинаются с буквы C. Поэтому зачем вы нам приводите здесь какое-то E0265 - не ясно.

При компиляции этого кода вы получаете ошибку

Code
1
(14,25): error C2061: syntax error: identifier 'C2'
Причину я указал выше.

Других ошибок в этом коде нет. И да, ошибка с русской буквой С присутствует прямо в тексте книги. Виноват, конечно, переводчик, а не автор, но тем не менее нужно иметь в виду, что книги Шилдта не обладают высоким качеством и запросто могут содержать ошибки уже в оригинале.

Добавлено через 8 минут
Цитата Сообщение от kanatoly Посмотреть сообщение
2 опережающее объявление работает только с указателем или ссылкой. Для самого объекта надо тело...вобще как-то странно передавать в качестве параметра сам объекта а не константную ссылку на него
Не надо выдумывать ерунду.
0
0 / 0 / 0
Регистрация: 28.10.2023
Сообщений: 13
13.11.2023, 08:49
Была у меня такая ошибка. Полдня искал причину. Потом нашёл. Поэтому якобы дружественная функция таковой не была. Неточность в написании... Так что ищите причину она у вас такая же. Только неточность другая. Если бы там не было неточностей, то всё скомпилилось как надо... А оно у вас компилится не так как вы хотите. Вот...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.11.2023, 08:49
Помогаю со студенческими работами здесь

что за ошибка как исправить
Серьезность Код Описание Проект Файл Строка Состояние подавления Ошибка MSB8036 The Windows SDK version 8.1 was not found. Install the...

Ошибка с strtok - как исправить?
Вот например: #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; void main () { char text=&quot;gh.gh.g hghgh o3 jf7...

Ошибка константа. как исправить?
помогите пожалуйста, как убрать эту ошибку?

в чём ошибка ? и как исправить ?
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; int main() { int n, i; char *s; printf(&quot;Введите n: &quot;); ...

Ошибка С3876 в С++. Как ее исправить?
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; #include &lt;windows.h&gt; using namespace std; class...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru