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

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

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

C++ Битовые поля
битовые поля C++
поля класса C++
C++ Битовые поля
C++ Поля битов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
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;
ssXXss
263 / 185 / 10
Регистрация: 15.01.2011
Сообщений: 668
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;
mc Sidh
 Аватар для 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;
}
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
12.07.2015, 12:31     Поля в синглтоне #5
Цитата Сообщение от mc Sidh Посмотреть сообщение
Ошибка выполнения всё равно остаётся:
После выхода из функции start объект t уничтожается, указатель на него становится невалидным.

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

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

Добавлено через 50 секунд
Цитата Сообщение от mc Sidh Посмотреть сообщение
Зачем делать поток static? Чтобы я мог обратиться к нему через синглтон.
Приведены какие-то фрагменты кода. Где тут синглтон и нужен ли он тут — еще под вопросом.
mc Sidh
 Аватар для 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 секунд
Вопрос о синглтоне снят?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
12.07.2015, 12:44     Поля в синглтоне #9
mc Sidh, непонятно зачем метод start сделан static. Как следствие, и все остальное тоже.
mc Sidh
 Аватар для mc Sidh
1 / 1 / 1
Регистрация: 29.03.2014
Сообщений: 50
12.07.2015, 12:47  [ТС]     Поля в синглтоне #10
0x10, а что мешает сделать это? Сервер, как объект, всегда один в программе, разве не проще сделать его статическим?
mc Sidh
 Аватар для mc Sidh
1 / 1 / 1
Регистрация: 29.03.2014
Сообщений: 50
12.07.2015, 12:49  [ТС]     Поля в синглтоне #11
Можно, конечно, сделать его нестатичным и хранить ссылку на него.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
12.07.2015, 12:49     Поля в синглтоне #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от mc Sidh Посмотреть сообщение
а что мешает сделать это?
Куча зависимостей. Тут у всех полей static не нужны, поскольку сам класс спроектирован как синглтон.
Либо наоборот instance не нужен, т.к. он не используется для доступа к полям: они все static public.
mc Sidh
 Аватар для mc Sidh
1 / 1 / 1
Регистрация: 29.03.2014
Сообщений: 50
12.07.2015, 12:56  [ТС]     Поля в синглтоне #13
Убрал static у полей, рантайм ошибка остаётся, буду дебажить. Спасибо всем
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
12.07.2015, 12:59     Поля в синглтоне #14
Предполагаю, что указатели остались висеть неинициализированными/невалидными.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
12.07.2015, 13:57     Поля в синглтоне #15
Приведённый в сообщении #8 код нарушает почти все принципы "хорошего объекта".
-- Статические методы и данные
-- Конструктор, который ничего не инициализирует
-- Методы, которые ничего не возвращают
-- Объект не является неизменяемым
-- Абстракция, предоставляемая объектом, непрозрачна
mc Sidh
 Аватар для mc Sidh
1 / 1 / 1
Регистрация: 29.03.2014
Сообщений: 50
12.07.2015, 21:47  [ТС]     Поля в синглтоне #16
mporro, насколько я еще помню, тема не о том, как хорошо я спроектировал класс, а как достучаться до полей. Что до самого класса - мне так удобно, станет неудобно - поменяю.
-- Предлагайте другой способ создания синглтона, я послушаю.
-- Пока мне там нечего инициализировать
-- У всех разное представление о том, что может, а что не может делать функция
-- А смысл тогда в неизменяемом объекте?(Да и вообще, что это значит?)
-- Я пишу приложение под конкретную задачу, и эта задача не требует сильной абстракции
Вопрос закрыт, за помощь спасибо. Ошибка была в другом коде.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
13.07.2015, 00:24     Поля в синглтоне #17
Цитата Сообщение от mc Sidh Посмотреть сообщение
как достучаться до полей
В том и беда, что у Вас ни класса, ни полей.
Есть процедурный код, в котором запутана передача параметров.
Уберите класс, напишите простые процедуры, все вопросы о "доступе к полям" отпадут.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
13.07.2015, 11:06     Поля в синглтоне #18
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
class Server
{
    Server(){ ... }   //<--- закрыт для внешнего мира
  ~Server(){ ... }
 
 
    // какие то самые обычные члены, 
    // как и у любого нормального класса
    std::thread* networkTrd;
    RakNet::RakPeerInterface* authPeer;
    ...
public:
 
    // локальный статик позволяет 
    // безопасным образом 
    // выполнять инициализацию
    // как в хэдэрах, так и в спп файлах
    static Server& getInstance() { static Server s; return s; }
 
    // обычная функция-член, 
    // как у любого нормального класса
    void start();
    ...
};
 
...
 
int main()
{
    Server::getInstance()  //<--- сервер полностью проинициализирован, 
        .Start();     //<--- запуск
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2015, 18:37     Поля в синглтоне
Еще ссылки по теме:

Поля C++
C++ Битовые поля
C++ Битовые поля

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

Или воспользуйтесь поиском по форуму:
mc Sidh
 Аватар для mc Sidh
1 / 1 / 1
Регистрация: 29.03.2014
Сообщений: 50
13.07.2015, 18:37  [ТС]     Поля в синглтоне #19
Пристали вы к моему классу, в самом деле. Я то спрашивал вообще как до статических полей в классе достучаться. А этот у меня уже не статический, прижало таки. Тему можно закрыть, спасибо hoggy за подробное объяснение.
Yandex
Объявления
13.07.2015, 18:37     Поля в синглтоне
Ответ Создать тему
Опции темы

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