Класс Singleton не работает должным образом C ++ - PullRequest
0 голосов
/ 21 сентября 2018

Я работаю над проектом, который включает создание одноэлементного класса. Поэтому я создал общую библиотеку для одноэлементного класса и создал два двоичных файла для использования этого класса.Когда первый exe вызывает статическую функцию класса "getInstance ()", создается новый экземпляр Singleton, и это ожидается, но когда я вызываю getInstance () из второго exe, новый экземпляр Singleton создается снова, в идеале, он должен был вернутьэкземпляр создан в первом случае.Вот код

singelton.h:

#include <iostream>
#include <stdio.h>

using namespace std;

class Singleton
{
private:
    static Singleton *single;
    Singleton()
    {
        //private constructor
    }
public:
    static Singleton* getInstance();
    void method();
    ~Singleton()
    {
    }
};

singleton.cpp

#include "singleton.h"

Singleton* Singleton::single = NULL;
Singleton* Singleton::getInstance()
{
    if(single == NULL)
    {
        printf("Creating a new instance of singleton\n");
        single = new Singleton();
        return single;
    }
    else
    {
        return single;
    }
}

void Singleton::method()
{
    cout << "Method of the singleton class" << endl;
}

main_test1.cpp:

#include "singleton.h"

int main()
{
    printf("entering test1\n");
    Singleton* singleton = Singleton::getInstance();

    if(singleton != NULL)
    {
        singleton->method();
    }

    while(1)
    {
        sleep(60);
    }
}

main_test2.cpp:

#include "singleton.h"

int main()
{
    printf("entering test2\n");
    Singleton* singleton = Singleton::getInstance();

    if(singleton != NULL)
    {
        singleton->method();
    }
}

Makefile:

DEPS = singleton.h
CC = gcc

shared :  $(DEPS)
    $(CC) -o libsingleton.so singleton.cpp -fPIC -shared

test1 : main_test1.o libsingleton.so
    $(CC) -o test1 main_test1.o libsingleton.so -lstdc++ -rdynamic

test2 : main_test2.o libsingleton.so
    $(CC) -o test2 main_test2.o libsingleton.so -lstdc++ -rdynamic

clean : 
    rm *.o test2 test1 libsingleton.so

.PHONY : clean

Ожидаемый результат:

$./test1&
$ entering test1
Creating a new instance of singleton
Method of the singleton class

$ ./test2
entering test2
Method of the singleton class

Текущий результат:

$./test1&
$ entering test1
Creating a new instance of singleton
Method of the singleton class

$ ./test2
entering test2
Creating a new instance of singleton
Method of the singleton class

Редактировать: С тех пор как яТеперь я знаю, что невозможно делать то, что я хотел, используя разделяемую библиотеку одноэлементного класса, теперь я планирую использовать подход с разделяемой памятью.Я наткнулся на хороший материал по использованию общей памяти (shmget) или mmap, проверьте эту ссылку, http://beej.us/guide/bgipc/html/single/bgipc.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...