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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
SaweR
29 / 29 / 1
Регистрация: 29.09.2009
Сообщений: 177
#1

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

09.03.2014, 10:43. Просмотров 550. Ответов 7
Метки нет (Все метки)

Всем привет. Подскажите, пожалуйста, как решить вот такую проблему:
У меня есть класс 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'
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2014, 10:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Связывание классов (C++):

связывание 2-х классов - C++
среда Embercadero RAD Studio 2010 столкнулся с проблемой: есть 2 класса например #ifndef Class1H #define Class1H

Связывание классов в 1 файле - C++
Здравствуйте! Разрабатывая программу столкнулся с проблемой... в 1 файле разместил несколько классов которые нужно между собой связать......

Разработать иерархию классов, демонстрирующее работу с коллекцией объектов разных классов - C++
Задание: Разработать в соответствии с индивидуальным заданием иерархию классов и приложение, демонстрирующее работу с коллекцией объектов...

Вынести методы из классов Panel и PictureBox (явная реализация методов базовых абстрактных классов) - C++
Тема: Множественное наследование. Явная реализация методов базовых абстрактных классов. Как вынести методы из классов Panel и...

Реализация отношения классов типа двунаправленная ассоциация, UML, порядок объявления классов, неполный класс - C++
Доброго времени суток! Осваивая UML, решил реализовать отношение двунаправленной ассоциации по диаграмме: У одного владельца...

Преобразования объектов классов в объекты других классов - C++
Задача типа обмен валют. Нужно конвертировать старый фунт стерлинг(фунт, шиллинг и пенсы) в доллары и обратно, по курсу 1 фунт = 50...

7
noname_club
103 / 93 / 10
Регистрация: 01.05.2013
Сообщений: 598
09.03.2014, 10:53 #2
но не могу получить доступ к этому свойству в методе send_to_all() класса connection
friend ?
0
Worf
43 / 43 / 6
Регистрация: 06.02.2014
Сообщений: 233
09.03.2014, 10:53 #3
Сделайте один класс дружественным для другого и сможете получать доступ к элементам обоих классов
0
zss
Модератор
Эксперт С++
6400 / 5966 / 1943
Регистрация: 18.12.2011
Сообщений: 15,356
Завершенные тесты: 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:
.....
0
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;
};
0
zss
Модератор
Эксперт С++
6400 / 5966 / 1943
Регистрация: 18.12.2011
Сообщений: 15,356
Завершенные тесты: 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();
}
1
SaweR
29 / 29 / 1
Регистрация: 29.09.2009
Сообщений: 177
09.03.2014, 12:51  [ТС] #7
Цитата Сообщение от zss Посмотреть сообщение
connection connections::clients;
А, понял.
0
zss
Модератор
Эксперт С++
6400 / 5966 / 1943
Регистрация: 18.12.2011
Сообщений: 15,356
Завершенные тесты: 1
09.03.2014, 12:53 #8
Цитата Сообщение от SaweR Посмотреть сообщение
Что это такое?
Все статические данные должны быть инициализированы вне объявления класса.
Эта строка именно для этого и нужна.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2014, 12:53
Привет! Вот еще темы с ответами:

Наследование классов. Копирование производных классов - C++
Здравствуйте всем, у меня такой вопрос: написал код #include &quot;stdafx.h&quot; class A //Создаем класс А { int mA; ...

Связывание библиотек - C++
Допустим есть решение из 4 проектов- Common, A , B и Program. Common содержит некие общие классы и интерфейсы ( например работа с...

Динамическое связывание - C++
Здравствуйте! Возник вопрос. Если у нас есть if и в теле if создаётся переменная, то какое в данном случае связывание? Я предполагаю, что...

Связывание файлов - C++
Здравствуйте, помогите пожалуйста решить вопрос. Была программа, содержащая класс. Хочу сделать так, чтобы класс был в отдельном файле....


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
09.03.2014, 12:53
Ответ Создать тему
Опции темы

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