Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Хулиган
85 / 80 / 21
Регистрация: 08.08.2012
Сообщений: 737
#1

не работает дружественность - C++

19.10.2013, 00:33. Просмотров 344. Ответов 5
Метки нет (Все метки)

Привожу пример тривиального кода, будем считать что все что надо уже перегружено:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class B;
 
class A
{
    friend class B;
    public:
    
    ...
    private:
            int x;
};
 
class B
{
    friend void XXX(B& b) { cout << b.col[i].x; }
    private:
            A* col;
};
Почему в функции ХХХ появляется ошибка: 'x' является приватным полем ??
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.10.2013, 00:33
Я подобрал для вас темы с готовыми решениями и ответами на вопрос не работает дружественность (C++):

Не работает дружественность классов
Всем привет, столкнулся с проблемой, не работает дружественность, объявляю...

Дружественность...
Можно ли наследовать дружественность? Т.е. есть класс А, наследуемый от B. Могу...

Дружественность классов
Просьба помочь горе-программисту. Проблема: есть дружественный класс...

Шаблоны и дружественность. Перегрузка оператора << через дружественную функцию в шаблоне
Доброго времени суток, уважаемые форумчане! Есть класс-шаблон, реализующий...

Проверить два числа на "дружественность"
Assembler. Даны два натуральных числа A и B. Если они являются дружественными...

Мышь работает через раз, то есть запустил ОС - мышь не работает, перезагрузил - мышь работает
Установлена Windows 7 со всеми последними обновлениями. Все всегда замечательно...

5
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.10.2013, 00:38 #2
Хулиган, приведи фрагмент кода который можно скормить компилятору чтобы повторить ошибку
1
ct0r
Игогошка!
1784 / 686 / 43
Регистрация: 19.08.2012
Сообщений: 1,323
Завершенные тесты: 1
19.10.2013, 00:40 #3
Лучший ответ Сообщение было отмечено как решение

Решение

Потому что на друзей транзитивность не распространяется.

Если функция - друг класса А, а классА - друг класса В, то функция - не друг класса В.
2
Хулиган
85 / 80 / 21
Регистрация: 08.08.2012
Сообщений: 737
19.10.2013, 00:43  [ТС] #4
String.h
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
#include <iostream>
#include <string>
using namespace std;
int Strlen(char* );
 
class list;
 
class String
{
friend class list;
 
public:
 
    String(char* buf = "");
    String(const String& );
 
    int size() const { return Strlen(str); }
 
    String& operator =(const String&);
    const char& operator[](int) const;
    char& operator[](int);
 
    friend ostream& operator <<(ostream&, const String&);
    friend istream& operator >>(istream&, String&);
 
 
private:
    char* str;
    
};
 
class list
{
 
public:
    list();
    list(int);
 
    friend void erase(char, list&);
 
    const String& operator[](int) const;
    String& operator[](int);
 
    ~list();
private:
    int size;
    String* col;
};

String.cpp
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include "String.h"
 
 
String::String(char* buf)
{
    int size = Strlen(buf);
    str = new char[size];
 
    for(int i = 0; i<size; ++i)
        str[i] = buf[i];
 
}
 
String::String(const String& buf)
{
    int size = buf.size();
    str = new char[size];
 
    for(int i = 0; i<size; ++i)
        str[i] = buf.str[i];
 
}
 
String& String:: operator =(const String& buf)
{
    if( this->size() )
    {
        delete [] this->str;
 
        int size = buf.size();
        this->str = new char[size];
 
        for(int i = 0; i<size; ++i)
            this->str[i] = buf.str[i];
 
    }
    return *this;
}
 
const char& String:: operator[](int i) const
{
    return this->str[i];
}
 
char& String:: operator[](int i)
{
    return this->str[i];
}
 
ostream& operator <<(ostream& os, const String& buf)
{
    os << buf.str;
 
    return os;
}
 
istream& operator >>(istream& is, String& s)
{
    char buf[256];
    is.getline(buf, sizeof(buf));
    s = buf;
 
    return is;
}
 
int Strlen(char* s)
{
    int size = 0;
 
    for (; s[size] != 0; size++);
 
    return size;
}
 
 
list::list()
{
    size = 10;
    col = new String[size];
}
 
list::list(int n)
{
    size = n;
    col = new String[size];
}
 
list::~list()
{
    delete []col;
}
 
const String& list:: operator[](int i) const
{
    return this->col[i];
}
 
String& list:: operator[](int i)
{
    return this->col[i];
}
 
void  erase(char ch, list& l)
{
    for(int i = 0; i<l.size; ++i)
        for(int j = 0; j<l.col[i].size(); ++j)
            if(l.col[i].str[j] == ch)
            {
 
            }
 
}

main.cpp
C++
1
2
3
4
5
6
#include "String.h"
 
int main()
{
    list l;
}
0
Cynacyn
33 / 33 / 7
Регистрация: 02.05.2013
Сообщений: 109
19.10.2013, 00:44 #5
е нужно перед void XXX писать friend
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class B;
class A { 
    friend class B; 
private:
    int x;
};
 
class B {
    void XXX(B& b) {cout << b.arr[0].x; }
    friend void ext(B& b);
private: 
    A* arr;
};
 
void ext(B& b) 
{
    cout << b.arr << endl;
}
1
Хулиган
85 / 80 / 21
Регистрация: 08.08.2012
Сообщений: 737
19.10.2013, 00:46  [ТС] #6
ct0r, аааааа...вылетело из головы) все теперь работает
0
19.10.2013, 00:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2013, 00:46
Привет! Вот еще темы с решениями:

не работает в ворде веб компонент,и скачав обновление ow 11 не работает все равно
проблема с веб элементами и обновлениями на них))

Не работает php на wps-е. Гланвая страница работает все остальное нет
На локальном дэнвере все отлично работает. Но при копировании на впс и...

Windows 7, не работает часть служб, не работает сеть, восстановление системы не помогает
Приветствую коллеги! Сам админю уже лет 10, не случалось ситуации еще что гугл...

Подключение библиотеки DLL C++: работает на примере консоли и не работает в WinForms App
Здравствуйте! Помогите начинающему бедному студенту!! Осваиваю С++. В книге...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru