Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
 Аватар для SleepMaster
40 / 40 / 7
Регистрация: 26.11.2011
Сообщений: 80

Обращение к приватному члену класса внутри пространства имён

28.11.2011, 16:34. Показов 3405. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Вот у меня есть код:
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
#include <iostream>
#include <conio.h>
#include <vector>
#include <string>
using namespace std;
 
namespace Pairs
{
 
class Name_pairs
{
    vector<string> name;
    vector<double> age;
public:
    void read_names(Name_pairs&);
    void read_ages(Name_pairs&);
    void sort(Name_pairs&);
    void print(const Name_pairs&) const;
    vector<string> return_names() { return name; }
    vector<double> return_ages() { return age; }
};
 
ostream& operator<< (ostream& os, const Pairs::Name_pairs& na);
bool operator==(Name_pairs& lna, Name_pairs& rna);
bool operator!=(Name_pairs& lna, Name_pairs& rna);
 
} // namespace Pairs;
 
/* Всё делал в одном и том же файле, лень было создавать другой. 
По правилам да, нужно создать файл .h, но по идее, это не важно. */
 
namespace Pairs {
 
// ... определение функций-членов класса Name_pairs
 
// теперь вопрос.
 
 
ostream& operator<<(ostream& os, const Name_pairs& na)
{
    // как обратится к приватному члену класса???
    for (int i=0; i<na.name.size(); i++) // здесь ошибка: нельзя обратится к name.
        return os << "Name: " << na.name[i] << "\tAge: " << na.age[i]; 
// а также не пойму как реализовать здесь, чтобы выводило на экран в цикле.
}
 
}
 
int main()
{
    Pairs::Name_pairs mine;
    mine.read_names(mine);
    mine.read_ages(mine);
    mine.print(mine);
    mine.sort(mine);
    mine.print(mine);
    getch();
    return 0;
}
Вообще, без namespace Pairs всё работает. Как это исправить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.11.2011, 16:34
Ответы с готовыми решениями:

Обращение к приватному полю класса
class CMessage { char *pmessage; public: void ShowIt() { cout&lt;&lt;endl&lt;&lt;pmessage&lt;&lt;endl; }

Обращение потока к функции-члену класса
Есть Класс MainWindow, функцией-членом которой выступает Reader(), при попытке обратиться поток к данной функции-члену из main'a через...

Доступ к приватному члену через нестатическую ссылку
Привет всем. забуксовал.. подтолкните пжалста: ситуация: - в хедере class A { private: int a; public: virtual void...

19
Заблокирован
28.11.2011, 16:41
Цитата Сообщение от SleepMaster Посмотреть сообщение
Вообще, без namespace Pairs всё работает. Как это исправить?
using namespace Pairs

Не?
1
программист С++
 Аватар для sandye51
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
28.11.2011, 16:53
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
#include <iostream>
#include <vector>
#include <string>
 
namespace Pairs
{
    class Name_pairs
    {
            std::vector<std::string> name;
            std::vector<double> age;
    public:
            void read_names(Name_pairs&);
            void read_ages(Name_pairs&);
            void sort(Name_pairs&);
            void print(const Name_pairs&) const;
 
            const std::vector<std::string>& return_names() const
            {
                return name;
            }
            const std::vector<double>& return_ages() const
            {
                return age;
            }
 
            friend std::ostream& operator<< (std::ostream& os, const Pairs::Name_pairs& na);
    };
 
    bool operator==(Name_pairs& lna, Name_pairs& rna);
    bool operator!=(Name_pairs& lna, Name_pairs& rna);
 
}
 
namespace Pairs
{
 
    std::ostream& operator<<(std::ostream& os, const Name_pairs& na)
    {
        for (unsigned int i = 0, end = na.name.size(); i < end; i++)
            os << "Name: " << na.name[i] << "\tAge: " << na.age[i] << std::endl;
        return os;
    }
}
 
int main()
{
        Pairs::Name_pairs mine;
//        mine.read_names(mine);
//        mine.read_ages(mine);
//        mine.print(mine);
//        mine.sort(mine);
//        mine.print(mine);
 
        return 0;
}
чтобы обратиться к приватному члену класса из какой либо функции (или оператора), например func, то надо сделать ее дружественной для этого класса
C++
1
2
3
4
5
6
7
8
9
10
11
class test
{
friend void func();
private:
int value;
};
 
void func(test obj)
{
obj.value = 1;  // ошибки нет
}
вызов других функций закомментил, т.к. не реализованы они у тебя еще.
1
 Аватар для SleepMaster
40 / 40 / 7
Регистрация: 26.11.2011
Сообщений: 80
28.11.2011, 17:07  [ТС]
Цитата Сообщение от Bers Посмотреть сообщение
using namespace Pairs
Да . Но теперь два других вопроса:
в теле
C++
1
2
3
4
5
ostream& operator<<(ostream& os, const Name_pairs& na)
{
        for (int i=0; i<na.name.size(); i++)
                return os << "Name: " << na.name[i] << "\tAge: " << na.age[i];
}
Нельзя использовать for, return, пишет что: требуется объявление.
И как мне вывести в цикле вектор?

Добавлено через 10 минут
Вобщем, вот вся программа, мне не жалко. Помогите с одной функцией:
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
#include <iostream>
#include <conio.h>
#include <vector>
#include <string>
using namespace std;
 
namespace Pairs
{
 
class Name_pairs
{
    vector<string> name;
    vector<double> age;
public:
    void read_names(Name_pairs&);
    void read_ages(Name_pairs&);
    void sort(Name_pairs&);
    void print(const Name_pairs&) const;
    vector<string> return_names() { return name; }
    vector<double> return_ages() { return age; }
 
};
 
ostream& operator<< (ostream& os, const Pairs::Name_pairs& na);
bool operator==(Name_pairs& lna, Name_pairs& rna);
bool operator!=(Name_pairs& lna, Name_pairs& rna);
 
}
 
using namespace Pairs {
 
void Name_pairs::read_names(Name_pairs &na)
{
    string val;
    while (cin>>val&&val!="Q")
        na.name.push_back(val);
}
 
void Name_pairs::read_ages(Name_pairs &a)
{
    double val;
    for (int i=0; i<a.name.size(); i++)
        { cin >> val;
            a.age.push_back(val); }
}
 
void Name_pairs::sort(Name_pairs& n)
{
    bool key = true;
    while (key) {
        key = false;
            for (int i=0; i<n.name.size()-1; i++)
                if (n.name[i+1]<n.name[i])
                {
                    swap(n.name[i+1], n.name[i]);
                    swap(n.age[i+1], n.age[i]);
                    key = true;
                }
    }
}
 
void Name_pairs::print(const Name_pairs& na) const
{
    for (int i=0; i<na.name.size(); i++)
        cout << na.name[i] << '\t' << na.age[i];
}
 
ostream& operator<<(ostream& os, const Name_pairs& na)
{
    /* помогите реализовать эту функцию */
    for (int i=0; i<na.name.size(); i++) 
        return os << "Name: " << na.name[i] << "\tAge: " << na.age[i];
}
 
}
 
int main()
{
    Pairs::Name_pairs mine;
    mine.read_names(mine);
    mine.read_ages(mine);
    mine.print(mine);
    mine.sort(mine);
    mine.print(mine);
    getch();
    return 0;
}
0
программист С++
 Аватар для sandye51
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
28.11.2011, 17:08
Цитата Сообщение от SleepMaster Посмотреть сообщение
омогите с одной функцией:
смотри мой код, она там реализована
1
 Аватар для SleepMaster
40 / 40 / 7
Регистрация: 26.11.2011
Сообщений: 80
28.11.2011, 17:10  [ТС]
Цитата Сообщение от sandye51 Посмотреть сообщение
смотри мой код, она там реализована
Но там она реализована внутри класса, да? Мне нужно, чтобы она была реализована вне класса внутри пространства имён. Так возможно вообще?
0
Заблокирован
28.11.2011, 17:12
избегай френдов, как огня - окажешь себе большую услугу
0
 Аватар для SleepMaster
40 / 40 / 7
Регистрация: 26.11.2011
Сообщений: 80
28.11.2011, 17:17  [ТС]
Спасибо, тупанул, всё работает
0
программист С++
 Аватар для sandye51
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
28.11.2011, 17:19
Цитата Сообщение от SleepMaster Посмотреть сообщение
вне класса внутри пространства имён. Так возможно вообще?
дружественные функции по определению вне класса, даже если реализованы внутри него
0
 Аватар для SleepMaster
40 / 40 / 7
Регистрация: 26.11.2011
Сообщений: 80
28.11.2011, 17:28  [ТС]
Цитата Сообщение от Bers Посмотреть сообщение
избегай френдов, как огня - окажешь себе большую услугу
Предложите альтернативу
0
Заблокирован
28.11.2011, 17:32
Цитата Сообщение от SleepMaster Посмотреть сообщение
Предложите альтернативу
Плясать нужно не от формального дееспособного кода.
А от конкретной задачи, которую этот код решает.

Можно конечно исследовать сам код, и догадаться по его поведению, какую задачу он решает.
Но по моему проще, просто спросить об этом у автора. М?

Автор до этого момента как то не озаботился сообщить, что должен делать его код.
0
программист С++
 Аватар для sandye51
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
28.11.2011, 17:35
Цитата Сообщение от SleepMaster Посмотреть сообщение
Предложите альтернативу
можно сделать чтобы функций не напрямую обращалась к полю, а вызывала какой нить метод, типо get_name() и с ним работала уже
1
 Аватар для SleepMaster
40 / 40 / 7
Регистрация: 26.11.2011
Сообщений: 80
28.11.2011, 17:49  [ТС]
Два метода на ввод векторов, которые принадлежат классу Name_pairs. Одна print, которую я как раз и хочу заменить на ostream& operator<<. sort() - сортирует класс по именам, с привязкой возрастов. И ещё две, которые просто возвращают вектора name и age. Но это абсолютно не важно уже. Всё что я хотел выяснить, это как можно было обойтись без friend'ов.
0
Заблокирован
28.11.2011, 18:22
SleepMaster,

У вас класс спроектирован некорректно. Расммотрим функцию

C++
1
2
3
4
5
6
void Name_pairs::read_names(Name_pairs &na)
{
        string val;
        while (cin>>val&&val!="Q")
                na.name.push_back(val);
}
Эта функция ничего не делает с ттем объектом, который ее вызвал. То есть она не меняет объект, который вызывает функцию. Она меняет тот объект, который вы передали в качестве параметра. Поэтому, когда функция не изменяет объект, который ее вызывает, то лучше эту функцию сделать статической.

Но я понимаю, что такой дизайн вы выбрали, потому что не понимаете, как работуют нестатические функции члены. На примере этой функции, я покажу, как она должна быть определена

C++
1
2
3
4
5
void Name_pairs::read_names()
{
        string val;
        while ( cin >> va l&& val !="Q" ) name.push_back( val );
}
В этом случае функция заполняет вектор не того объекта, который был передан в качестве параметра функции, а именно тот сам объект, который вызвал ее.
2
 Аватар для SleepMaster
40 / 40 / 7
Регистрация: 26.11.2011
Сообщений: 80
28.11.2011, 18:49  [ТС]
Хорошо. Объясню, как я это понимаю:
friend используется, если мы хотим предоставить обычной функции доступ к закрытым и защищенным членам класса. Однако, внутри friend'овской функции нельзя использовать static и extern, отсюда и ограничение на использование.
0
Заблокирован
28.11.2011, 18:51
Цитата Сообщение от SleepMaster Посмотреть сообщение
friend используется, если мы хотим предоставить обычной функции доступ к закрытым и защищенным членам класса. Однако, внутри friend'овской функции нельзя использовать static и extern.
Сам факт предоставления кому бы то ни было "закрытых" данных уже пахнет нарушением инкапсуляции. Этого нужно избегать настолько, насколько это вообще возможно.

Или пиши все сразу в паблике, и не парься.
0
 Аватар для SleepMaster
40 / 40 / 7
Регистрация: 26.11.2011
Сообщений: 80
28.11.2011, 19:03  [ТС]
Тогда вопрос:
Как обойтись без frienda в этом
коде

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
#include <iostream>
#include <conio.h>
#include <vector>
#include <string>
using namespace std;
 
namespace Pairs
{
 
class Name_pairs
{
    vector<string> name;
    vector<double> age;
public:
    void read_names(Name_pairs&);
    void read_ages(Name_pairs&);
    void sort(Name_pairs&);
    void print(const Name_pairs&) const;
    vector<string> return_names() { return name; }
    vector<double> return_ages() { return age; }
    friend ostream& operator<< (ostream& os, const Pairs::Name_pairs& na);
};
 
bool operator==(Name_pairs& lna, Name_pairs& rna);
bool operator!=(Name_pairs& lna, Name_pairs& rna);
 
}
 
namespace Pairs
{
 
void Name_pairs::read_names(Name_pairs &na)
{
    string val;
    while (cin>>val&&val!="Q")
        na.name.push_back(val);
}
 
void Name_pairs::read_ages(Name_pairs &a)
{
    double val;
    for (int i=0; i<a.name.size(); i++)
        { cin >> val;
            a.age.push_back(val); }
}
 
void Name_pairs::sort(Name_pairs& n)
{
    bool key = true;
    while (key) {
        key = false;
            for (int i=0; i<n.name.size()-1; i++)
                if (n.name[i+1]<n.name[i])
                {
                    swap(n.name[i+1], n.name[i]);
                    swap(n.age[i+1], n.age[i]);
                    key = true;
                }
    }
}
 
void Name_pairs::print(const Name_pairs& na) const
{
    for (int i=0; i<na.name.size(); i++)
        cout << na.name[i] << '\t' << na.age[i];
}
 
ostream& operator<<(ostream& os, const Name_pairs& na)
{
        for (unsigned int i = 0, end = na.name.size(); i < end; i++)
            os << "Name: " << na.name[i] << "\tAge: " << na.age[i] << std::endl;
        return os;
}
 
}
 
int main()
{
    Pairs::Name_pairs mine;
    mine.read_names(mine);
    mine.read_ages(mine);
    cout<<mine;
    mine.sort(mine);
    cout<<mine;
    getch();
    return 0;
}
Не нужно исправлять других ошибок, я знаю что код требует доработки. Просто перепишите функцию
operator<<
C++
1
2
3
4
5
6
ostream& operator<<(ostream& os, const Name_pairs& na)
{
        for (unsigned int i = 0, end = na.name.size(); i < end; i++)
            os << "Name: " << na.name[i] << "\tAge: " << na.age[i] << std::endl;
        return os;
}
так, чтобы она не использовала friendов.
0
программист С++
 Аватар для sandye51
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
28.11.2011, 19:07
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
#include <iostream>
#include <conio.h>
#include <vector>
#include <string>
using namespace std;
 
namespace Pairs
{
 
class Name_pairs
{
        vector<string> name;
        vector<double> age;
public:
        void read_names(Name_pairs&);
        void read_ages(Name_pairs&);
        void sort(Name_pairs&);
        void print(const Name_pairs&) const;
        const vector<string>& return_names() const { return name; }
        const vector<double>& return_ages() const { return age; }
};
 
bool operator==(Name_pairs& lna, Name_pairs& rna);
bool operator!=(Name_pairs& lna, Name_pairs& rna);
 
}
 
namespace Pairs
{
 
void Name_pairs::read_names(Name_pairs &na)
{
        string val;
        while (cin>>val&&val!="Q")
                na.name.push_back(val);
}
 
void Name_pairs::read_ages(Name_pairs &a)
{
        double val;
        for (unsigned int i=0; i<a.name.size(); i++)
                { cin >> val;
                        a.age.push_back(val); }
}
 
void Name_pairs::sort(Name_pairs& n)
{
        bool key = true;
        while (key) {
                key = false;
                        for (unsigned int i=0; i<n.name.size()-1; i++)
                                if (n.name[i+1]<n.name[i])
                                {
                                        swap(n.name[i+1], n.name[i]);
                                        swap(n.age[i+1], n.age[i]);
                                        key = true;
                                }
        }
}
 
void Name_pairs::print(const Name_pairs& na) const
{
        for (unsigned int i=0; i<na.name.size(); i++)
                cout << na.name[i] << '\t' << na.age[i];
}
 
ostream& operator<<(ostream& os, const Name_pairs& na)
{
    const std::vector<std::string>& names = na.return_names();
    const std::vector<double>& ages = na.return_ages();
 
    for (unsigned int i = 0, end = names.size(); i < end; i++)
        os << "Name: " << names[i] << "\tAge: " << ages[i] << std::endl;
    return os;
}
 
}
 
int main()
{
        Pairs::Name_pairs mine;
        mine.read_names(mine);
        mine.read_ages(mine);
        cout<<mine;
        mine.sort(mine);
        cout<<mine;
        getch();
        return 0;
}
очень просто
1
Заблокирован
28.11.2011, 19:08
SleepMaster, да код написать не сложно, только у тебя ж от этого в голове ума не прибавиться.

Ты пойми, идею нужно понимать, а не то, как её реализовать
0
 Аватар для SleepMaster
40 / 40 / 7
Регистрация: 26.11.2011
Сообщений: 80
28.11.2011, 19:18  [ТС]
sandye51, Благодарю. Считаю, что тему можно закрыть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.11.2011, 19:18
Помогаю со студенческими работами здесь

Дружественная функция, объявлённая ранее вне пространства имён класса -> error LNK2019 в Visual Studio 2012
Всем привет. Долгое время пытался откопать ответ в гугле, но не получилось. Заранее благодарен. void f(){}; namespace space { ...

Обращение к переменным одного метода из другого внутри класса
Доброго времени суток. Поставлена задача написать программу реализующую матрицу и поостые арифметические действия, определение детерменанта...

Обращение к члену структуры
В чем разница между: a-&gt;b и a.b

Обращение к члену protected
Добрый день, помогите разобраться Обращение к члену protected, сообщается ошибкой Код класса: #include &lt;iostream&gt; #include...

Пространства имён с++
Может я отсталый совсем, но перечислите пожалуйста все известные вам пространства имён в с++


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru