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

Связывание классов - C++

Восстановить пароль Регистрация
 
SaweR
 Аватар для SaweR
29 / 29 / 1
Регистрация: 29.09.2009
Сообщений: 177
09.03.2014, 10:43     Связывание классов #1
Всем привет. Подскажите, пожалуйста, как решить вот такую проблему:
У меня есть класс connections который хранит в себе все активные соединения типа connection.
Возникает ситуация когда один из множества connection хочет отправить сообщение всем клиентам в классе connections.
Для этого я сделал свойство clients в классе connections статическим, но не могу получить доступ к этому свойству в методе send_to_all() класса connection.
Мне нужно чтобы метод send_to_all() обращался к статическому полю clients класса connections. Если вы знаете обходные пути, то предлагайте.
Исходный код:

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "Connections.h"
 
int main()
{
    // Создание менеджера соединений
    connections client_manager;
 
    // Имитация подключений
    for(int i = 0; i < 3; i++) client_manager.add();
 
    // Имитация работы функции массовой отправки сообщений
    list<connection>::iterator it = connections::clients.begin();
    (*it).send_to_all();
 
    return 0;
}
Connections.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <list>
#include "Connection.h"
using namespace std;
 
 
class connections
{
public:
    static list <connection> clients;
    static void add()
    { 
        connection c;
        clients.insert(clients.end(), c);
    }
};
Connection.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <list>
using namespace std;
 
class connection
{
public:
    void send_to_all()
    {
        for (list<connection>::iterator it = connections::clients.begin(); it != connections::clients.end(); ++it)
            (*it).send();
    }
    void send(){ cout << "send()"; };
};
Ошибки:
HTML5
1
2
3
4
5
6
\connection.h(12): error C2653: connections: не является именем класса или пространства имен
\connection.h(12): error C2065: clients: необъявленный идентификатор
\connection.h(12): error C2228: выражение слева от ".begin" должно представлять класс, структуру или объединение
1>          тип: 'unknown-type'
\connection.h(12): error C2228: выражение слева от ".end" должно представлять класс, структуру или объединение
1>          тип: 'unknown-type'
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
noname_club
 Аватар для noname_club
100 / 88 / 9
Регистрация: 01.05.2013
Сообщений: 563
09.03.2014, 10:53     Связывание классов #2
но не могу получить доступ к этому свойству в методе send_to_all() класса connection
friend ?
Worf
42 / 42 / 6
Регистрация: 06.02.2014
Сообщений: 227
09.03.2014, 10:53     Связывание классов #3
Сделайте один класс дружественным для другого и сможете получать доступ к элементам обоих классов
zss
Модератор
Эксперт С++
 Аватар для zss
5952 / 5557 / 1787
Регистрация: 18.12.2011
Сообщений: 14,202
Завершенные тесты: 1
09.03.2014, 11:44     Связывание классов #4
Тут дело не в дружественности.
Надо сделать предварительное объявление класса connections
в connection.h:
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include <list>
using namespace std;
class connections; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
class connection
{
public:
.....
SaweR
 Аватар для SaweR
29 / 29 / 1
Регистрация: 29.09.2009
Сообщений: 177
09.03.2014, 12:31  [ТС]     Связывание классов #5
Немного другой вариант, но тоже есть ошибка: Для того чтобы вызвать метод connection::use() нужно чтобы класс connections был определён, а для определения класса connections нужно чтобы connection::use() тоже был определён. Вот такая вот чихарда.
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
#include <iostream>
using namespace std;
 
class connections;
 
class connection
{
public:
    void use();
    void send();
};
 
void connection::send()
{
    cout << "send();";
}
 
void connection::use()
{
    connections::clients.send(); // error
}
 
class connections
{
  friend class connection;
public:
  static connection clients;
};
zss
Модератор
Эксперт С++
 Аватар для zss
5952 / 5557 / 1787
Регистрация: 18.12.2011
Сообщений: 14,202
Завершенные тесты: 1
09.03.2014, 12:38     Связывание классов #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
#include <iostream>
using namespace std;
class connection
{
public:
    void use();
    void send();
};
class connections
{
public:
  static connection clients;
};
 
connection connections::clients; 
 
void connection::send()
{
    cout << "send();";
}
 
void connection::use()
{
    connections::clients.send();
}
SaweR
 Аватар для SaweR
29 / 29 / 1
Регистрация: 29.09.2009
Сообщений: 177
09.03.2014, 12:51  [ТС]     Связывание классов #7
Цитата Сообщение от zss Посмотреть сообщение
connection connections::clients;
А, понял.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2014, 12:53     Связывание классов
Еще ссылки по теме:

Связывание библиотек C++
C++ Реализация отношения классов типа двунаправленная ассоциация, UML, порядок объявления классов, неполный класс
C++ Динамическое связывание DLL

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

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
5952 / 5557 / 1787
Регистрация: 18.12.2011
Сообщений: 14,202
Завершенные тесты: 1
09.03.2014, 12:53     Связывание классов #8
Цитата Сообщение от SaweR Посмотреть сообщение
Что это такое?
Все статические данные должны быть инициализированы вне объявления класса.
Эта строка именно для этого и нужна.
Yandex
Объявления
09.03.2014, 12:53     Связывание классов
Ответ Создать тему
Опции темы

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