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

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

Войти
Регистрация
Восстановить пароль
 
 
mc Sidh
1 / 1 / 1
Регистрация: 29.03.2014
Сообщений: 50
#1

Поля в синглтоне - C++

12.07.2015, 12:04. Просмотров 334. Ответов 18
Метки нет (Все метки)

Каким образом нужно объявлять поля в синглтоне? Если объявляю так:
C++
1
2
public:
    static std::thread* trd;
То в .cpp файле с реализацией функций синглтона выдаёт ошибку LNK2001(Unresolved external symbol) на эти поля.
А если в .cpp написать:
C++
1
 std::thread* MyClass::trd;
То ошибки нету, но зато появляется ошибка выполнения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2015, 12:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поля в синглтоне (C++):

Битовые поля. Поля без типа и имени - C++
Вчера сделал очень интересную и болезненную ошибку (с точки зрения времени, так как искал я ее долго)... представьте структуру (битовое...

Копировать значение поля m_moo в значение поля m_moo класса foo - C++
А что означает запись? Foo1(Foo1 const& foo):m_moo(foo.moo) то что это к.копирования понятно.Не понятно,зачем список инициализации.... ...

Хранение данных в синглтоне - правильно ли это? - Программирование Android
Приветствую, Приложение состоит из Activity и Service. Им обоим надо работать с данными, находящимися в ArrayList, который берет их из...

Зависимые поля (список значений одного поля зависит от значения другого поля) - MS Access
Здравствуйте, Уважаемые участники форума, изучив множество подобных вопросов на разных форумах, не смог найти для себя нужный вариант....

Как связать между собой два поля (список значений одного поля зависит от значения другого поля) - MS Access
Есть таблица: предмет, КодТипаМатериала (список), КодМатериала (список) для примера: стул, ткань, чёрное сукно ...

Значение поля 2 является именем для поля 1 ( Сформировать JSON объект) - PHP БД
Коллеги, подскажите как решить или где посмотреть следующую информацию. У меня есть таблица: ID Fio Month Parametr ...

18
rikimaru2013
C++ Game Dev
2438 / 1132 / 240
Регистрация: 30.11.2013
Сообщений: 3,688
12.07.2015, 12:11 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
// h
public:
    static std::thread* trd;
C++
1
2
// cpp
std::thread* MyClass::trd = nullptr;
1
ssXXss
266 / 188 / 10
Регистрация: 15.01.2011
Сообщений: 681
12.07.2015, 12:19 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
//*.h
//#include ....
 
 
class MyClass{
public:
    static std::thread* pthread;
 
    MyClass();
    ~MyClass();
 
};
 
//*.cpp
 
MyClass::MyClass()
{
    
}
 
MyClass::~MyClass()
{
 
}
 
std::thread* MyClass::pthread = nullptr;
1
mc Sidh
1 / 1 / 1
Регистрация: 29.03.2014
Сообщений: 50
12.07.2015, 12:29  [ТС] #4
А как быть в случае с коллекциями? Например: map<short, int32> collection; Как их инициализировать в этом случае?

Добавлено через 2 минуты
Ошибка выполнения всё равно остаётся:
C++
1
2
3
4
5
void MyClass::start()
{
 std::thread t(startTrd);
 trd = &t;
}
0
0x10
2475 / 1648 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
12.07.2015, 12:31 #5
Цитата Сообщение от mc Sidh Посмотреть сообщение
Ошибка выполнения всё равно остаётся:
После выхода из функции start объект t уничтожается, указатель на него становится невалидным.

Какая проблема решается? Зачем понадобилось поток делать static?
0
mc Sidh
1 / 1 / 1
Регистрация: 29.03.2014
Сообщений: 50
12.07.2015, 12:37  [ТС] #6
Нужно хранить ссылку на поток, в котором выполняется чтение из сетевого потока. startTrd - функция с замкнутым циклом чтения.

Добавлено через 3 минуты
Зачем делать поток static? Чтобы я мог обратиться к нему через синглтон.
0
0x10
2475 / 1648 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
12.07.2015, 12:38 #7
См std::shared_ptr.

Добавлено через 50 секунд
Цитата Сообщение от mc Sidh Посмотреть сообщение
Зачем делать поток static? Чтобы я мог обратиться к нему через синглтон.
Приведены какие-то фрагменты кода. Где тут синглтон и нужен ли он тут — еще под вопросом.
0
mc Sidh
1 / 1 / 1
Регистрация: 29.03.2014
Сообщений: 50
12.07.2015, 12:43  [ТС] #8
Server.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
#pragma once
#include "RakPeerInterface.h"
#include <map>
#include "ServerInfo.h"
#include "ConnectedClient.h"
#include <thread>
 
using namespace std;
 
class Server
{
private:
    Server(){}
    ~Server(){}
    static void startNetworkTrd();
public:
    static Server& getInstance();
    static std::thread* networkTrd;
    static RakNet::RakPeerInterface* authPeer;
    static map<std::string, ServerInfo> _servers;
    static map<RakNet::RakNetGUID, ConnectedClient> _connections;
    static void start();
    static bool hasClient(RakNet::RakNetGUID);
};
Server.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
#include "Server.h"
#include "NetworkListener.h"
#include "easylogging++.h"
#include "ConfigLoader.h"
 
std::thread* Server::networkTrd = nullptr;
RakNet::RakPeerInterface* Server::authPeer = nullptr;
map<std::string, ServerInfo> Server::_servers;
map<RakNet::RakNetGUID, ConnectedClient> Server::_connections;
 
Server& Server::getInstance(){
    static Server instance;
    return instance;
}
 
bool Server::hasClient(RakNet::RakNetGUID guid)
{
    for (map<RakNet::RakNetGUID, ConnectedClient>::iterator ii = Server::getInstance()._connections.begin(); ii != Server::getInstance()._connections.end(); ++ii)
    {
        if ((*ii).first == guid) {
            return true;
        }
    }
    return false;
}
 
void Server::startNetworkTrd()
{
    authPeer = RakNet::RakPeerInterface::GetInstance();
    RakNet::Packet *packet;
 
    RakNet::SocketDescriptor sd(ConfigLoader::getIntVal("Network-PoolerPort"), 0);
    Server::getInstance().authPeer->Startup(ConfigLoader::getIntVal("Network-MaxCons"), &sd, 1);
 
    LOG(INFO) << "Starting the authorization server...";
 
    Server::getInstance().authPeer->SetMaximumIncomingConnections(ConfigLoader::getIntVal("Network-MaxCons"));
 
    LOG(INFO) << "Server has been started! Listening for conections...";
 
    while (1)
    {
        Sleep(0);
        for (packet = Server::getInstance().authPeer->Receive(); packet; Server::getInstance().authPeer->DeallocatePacket(packet), packet = Server::getInstance().authPeer->Receive())
        {
            NetworkListener::getInstance().handle(packet);
        }
    }
 
 
    RakNet::RakPeerInterface::DestroyInstance(Server::getInstance().authPeer);
}
 
void Server::start(){
    std::thread trs(startNetworkTrd);
    networkTrd = &trs;
}
Добавлено через 27 секунд
Вопрос о синглтоне снят?
0
0x10
2475 / 1648 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
12.07.2015, 12:44 #9
mc Sidh, непонятно зачем метод start сделан static. Как следствие, и все остальное тоже.
0
mc Sidh
1 / 1 / 1
Регистрация: 29.03.2014
Сообщений: 50
12.07.2015, 12:47  [ТС] #10
0x10, а что мешает сделать это? Сервер, как объект, всегда один в программе, разве не проще сделать его статическим?
0
mc Sidh
1 / 1 / 1
Регистрация: 29.03.2014
Сообщений: 50
12.07.2015, 12:49  [ТС] #11
Можно, конечно, сделать его нестатичным и хранить ссылку на него.
0
0x10
2475 / 1648 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
12.07.2015, 12:49 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от mc Sidh Посмотреть сообщение
а что мешает сделать это?
Куча зависимостей. Тут у всех полей static не нужны, поскольку сам класс спроектирован как синглтон.
Либо наоборот instance не нужен, т.к. он не используется для доступа к полям: они все static public.
1
mc Sidh
1 / 1 / 1
Регистрация: 29.03.2014
Сообщений: 50
12.07.2015, 12:56  [ТС] #13
Убрал static у полей, рантайм ошибка остаётся, буду дебажить. Спасибо всем
0
0x10
2475 / 1648 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
12.07.2015, 12:59 #14
Предполагаю, что указатели остались висеть неинициализированными/невалидными.
0
mporro
256 / 101 / 14
Регистрация: 04.07.2014
Сообщений: 571
12.07.2015, 13:57 #15
Приведённый в сообщении #8 код нарушает почти все принципы "хорошего объекта".
-- Статические методы и данные
-- Конструктор, который ничего не инициализирует
-- Методы, которые ничего не возвращают
-- Объект не является неизменяемым
-- Абстракция, предоставляемая объектом, непрозрачна
0
12.07.2015, 13:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2015, 13:57
Привет! Вот еще темы с ответами:

Ограничение вариантов заполнения поля в форме на основе уже заполненного поля - MS Access
Здравствуйте. Сразу к делу- Имеется база, в ней,кроме прочих,существуют таблицы &quot;Структура мест склада&quot; имеющая поля &quot;Тип Места&quot; и...

Как произвести выборку одного поля по условию другого поля в коллекции? - LINQ
Всем привет! Как произвести выборку одного поля по условию другого поля в коллекции? Т.е. допустим есть класс MyClass: public class...

Обновление одного поля таблицы, при заполнении поля в другой таблице - MS Access
Друзья помогите новичку! Есть две таблицы -продажа(id продажи, сумма продажи) -скидка(id скидки, id продажи, скидка 15%) Как...

Невозможно выполнить выборку по имени поля (по номеру поля все работает) - C#
Вот кусок кода: conn = new SqlCeConnection(&quot;Data Source = Database.sdf;&quot;); conn.Open(); ...


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

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

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