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

Не работает дружественный метод класса

21.01.2020, 15:16. Показов 4369. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Почему такой код не работает? Работает только в случае, если весь класс сделать дружественным. В чём ошибка?
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
// Класс вектор
class vector;
 
// Класс точки
class point
{
public:
    // Делаю метод класса vector дружественным по отношению к point
  
    friend void vector::someMethod(point& A, point& B);
 
private:
    int x;
    int y;
};
 
 
class vector
{
public:
 
    void someMethod(point& A,point& B)
    {
        vectorCoordinte.x = A.x - B.x;  // Этот участок кода выдаёт ошибку
        vectorCoordinte.y = A.y - B.y;  // "член "point::y" (объявлено в строке ...) недоступно
    }
 
private:
    point vectorCoordinte;
};
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2020, 15:16
Ответы с готовыми решениями:

Дружественный метод класса и ошибка доступа
class B; class A { public: void f(B& b); }; class B { private:

Дружественный метод
Добрый вечер. Не могу решить проблему с дружественным методом класса. Есть два класса. 1ый...

Дружественный метод. Ошибка доступа к полям
Доброго времени суток, реализовываю паттерн состояние. Для доступа к полям класса контекста( в моем...

Дружественный оператор не видит закрытые члены класса
angle.h: #pragma once #include <iostream> using std::ostream; class Angle { friend...

19
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
21.01.2020, 15:31 2
Цитата Сообщение от Farnik Посмотреть сообщение
// Делаю метод класса vector дружественным по отношению к point
У тебя в этом месте vector - неполный тип. Нет у него методов.
0
0 / 0 / 0
Регистрация: 15.01.2020
Сообщений: 64
21.01.2020, 15:33  [ТС] 3
Цитата Сообщение от zayats80888 Посмотреть сообщение
У тебя в этом месте vector - неполный тип. Нет у него методов.
Не совсем понял что это значит
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
21.01.2020, 16:13 4
Лучший ответ Сообщение было отмечено Farnik как решение

Решение

Цитата Сообщение от Farnik Посмотреть сообщение
Не совсем понял что это значит
Это значит что ты можешь использовать только ссылки и указатели на этот класс (ну или использовать его в предварительных объявлениях функций(методов))
В твоем случае можно так:
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
// Класс вектор
template<class T> class vector
{
public:
    void someMethod(T&, T&);
private:
    T vectorCoordinte;
};
// Класс точки
class point
{
public:
 
    template<class T>
    friend void vector<T>::someMethod(T&, T&);
 
private:
    int x;  int y;
};
 
template<>
void vector<point>::someMethod(point& A, point& B)
{
    vectorCoordinte.x = A.x - B.x;
    vectorCoordinte.y = A.y - B.y;
};
1
43 / 39 / 5
Регистрация: 16.09.2019
Сообщений: 285
21.01.2020, 16:14 5
Цитата Сообщение от Farnik Посмотреть сообщение
// Этот участок кода выдаёт ошибку
Докажи.
Код идеален до безобразия - нет там никакой ошибки.
0
0 / 0 / 0
Регистрация: 15.01.2020
Сообщений: 64
21.01.2020, 16:22  [ТС] 6
zayats80888, а почему тогда, если я весь класс сделаю дружественным, то такой проблемы нет?

Добавлено через 2 минуты
БедолагаЖека, такой код Visual Studio даже не компилирует
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
21.01.2020, 16:22 7
Цитата Сообщение от Farnik Посмотреть сообщение
а почему тогда, если я весь класс сделаю дружественным, то такой проблемы нет?
потому что ты не ссылаешься на то, чего в данном месте компилятору не известно
0
0 / 0 / 0
Регистрация: 15.01.2020
Сообщений: 64
21.01.2020, 16:27  [ТС] 8
А в таком случае? Теперь-то класс point точно знает про метод класса вектор. Или я что-то неправильно понял?
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
// Класс вектор
class vector;
void vector::someMethod(point& A, point& B)
{
    vectorCoordinte.x = A.x - B.x;  // Этот участок кода выдаёт ошибку
    vectorCoordinte.y = A.y - B.y;  // "член "point::y" (объявлено в строке ...) недоступно
}
 
// Класс точки
class point
{
public:
 
    // Делаю метод класса vector дружественным по отношению к point
    friend void vector::someMethod(point& A, point& B);
 
private:
    int x;
    int y;
};
 
class vector
{
public:
 
    void someMethod(point& A, point& B);    
 
private:
    point vectorCoordinte;
};
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
21.01.2020, 16:29 9
Цитата Сообщение от Farnik Посмотреть сообщение
Или я что-то неправильно понял?
теперь компилятору не понятно еще больше сущностей
0
0 / 0 / 0
Регистрация: 15.01.2020
Сообщений: 64
21.01.2020, 16:32  [ТС] 10
zayats80888, можно ссылку на какую-нибудь статью на эту тему? Как-то слабо я понял этот момент
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
21.01.2020, 17:18 11
Farnik,
forward declaration
incomplete type

Добавлено через 43 минуты

Не по теме:

Farnik, пост #4 - это не решение проблемы а способ извернуться, проблема - кривая архитектура. Пересмотри в первую очередь её.

1
0 / 0 / 0
Регистрация: 15.01.2020
Сообщений: 64
21.01.2020, 17:29  [ТС] 12
zayats80888, я хотел бы, чтобы мой класс vector, который определён ещё до класса point, хранил переменную типа point, то есть координаты вектора. Не вижу, если честно, других вариантов.
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
21.01.2020, 17:42 13
Цитата Сообщение от Farnik Посмотреть сообщение
Не вижу, если честно, других вариантов.
Объясни зачем ты спрятал x y?

Добавлено через 4 минуты
Ну или зачем вообще нужен класс point? В геометрическом смысле точка это вектор.
0
0 / 0 / 0
Регистрация: 15.01.2020
Сообщений: 64
21.01.2020, 17:45  [ТС] 14
zayats80888, не то чтобы в этом всём этом был смысл. Я не так давно начал изучать ООП и сейчас просто пишу, что придёт в голову, чтобы просто понять как всё оно работает.
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
21.01.2020, 17:46 15
Цитата Сообщение от Farnik Посмотреть сообщение
сейчас просто пишу, что придёт в голову, чтобы просто понять как всё оно работает.
ну тогда ладно, экперементируй
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
21.01.2020, 19:33 16
Цитата Сообщение от Farnik Посмотреть сообщение
А в таком случае?
В таком реализация void vector::someMethod(point& A, point& B) должна быть после определения class vector, т.е. в самом конце.
1
43 / 39 / 5
Регистрация: 16.09.2019
Сообщений: 285
21.01.2020, 21:39 17
Цитата Сообщение от TRam_ Посмотреть сообщение
В таком реализация void vector::someMethod(point& A, point& B) должна быть после определения class vector, т.е. в самом конце.
Да у него же "круговая порука": в первом френд второго, а во втором поле первого, разносить по разным файлам (хидерам и суркам), с взаимным инклудом лень, видимо, описание класса наверх кинул, что бы компиль не ругался, а компоновщик ругается
Вот такой нынче пошел студент, не нужно ему решение его загадки....
ИМХО.
0
0 / 0 / 0
Регистрация: 15.01.2020
Сообщений: 64
21.01.2020, 21:59  [ТС] 18
БедолагаЖека, Тут ты не прав. Если тебе всё кажется очевидным, то это ещё ничего не значит. А ошибку я выделил комментарием в коде
Цитата Сообщение от Farnik Посмотреть сообщение
// "член "point::y" (объявлено в строке ...) недоступно
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
21.01.2020, 22:23 19
Цитата Сообщение от zayats80888 Посмотреть сообщение
ты можешь использовать только ссылки и указатели на этот класс
Вместо шаблонов существует возможность сделать именно динамически создаваемые объекты в указателях, хотя так лучше не делать:

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
class point;
 
// Класс вектор
class vector
{
public:
 
    vector();
    ~vector();
    void someMethod(point& A,point& B);
 
private:
    point *vectorCoordinte;
};
 
 
 
// Класс точки
class point
{
public:
    // Делаю метод класса vector дружественным по отношению к point
  
    friend void vector::someMethod(point& A, point& B);
 
private:
    int x;
    int y;
};
 
vector::vector() : vectorCoordinte(new point) {}
vector::~vector()
{
   delete vectorCoordinte;     
}
 
void vector::someMethod(point& A,point& B)
{
    vectorCoordinte->x = A.x - B.x;
    vectorCoordinte->y = A.y - B.y;
}
0
Вездепух
Эксперт CЭксперт С++
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,870
21.01.2020, 23:08 20
Цитата Сообщение от Farnik Посмотреть сообщение
А в таком случае?
В языке С++ квалифицированные имена, т.е. имена вида class::member, могут использоваться только для ссылки на уже ранее объявленные сущности, но не для введения новых сущностей. Поэтому как вы ни вертитесь, вы не сможете использовать имя vector::someMethod до тех пор, пока полностью не определите класс vector.

P.S. Это правило не распространяется на имена вида T::member, где T является параметром шаблона, но это уже другая история.
1
21.01.2020, 23:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.01.2020, 23:08
Помогаю со студенческими работами здесь

Реализовать дружественный метод задания размерности матрицы
Помогите пожалуйста!!реализовать дружественный метод задания размерности матрицы для её генерации

Дружественный перегруженный оператор не может обратиться к приватной переменной класса
#include&lt;iostream&gt; #include&lt;cstring&gt; #include&lt;fstream&gt; using namespace std; class phonebook {...

Не работает метод класса
#define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; using namespace std; class Lines {...

Не работает метод класса
class Lines { private: char *line; public: void setLine(char *l) { int len =...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru