标签: singleton

在 C++ 中调用单例对象的正确方法

我已经根据此处发布的命中构建了一个单例类。

我用一个getMessage()函数扩展了它,该函数将检索内部字典消息 - 字典只需要在整个应用程序上加载一次,这就是单例的原因。

我的代码:

单例.hpp

class Singleton {

public:

    static Singleton& getInstance();
    std::string getMessage(std::string code);

private:

    Singleton() {}; 
    Singleton(Singleton const&) = delete;
    void operator=(Singleton const&) = delete;
};
Run Code Online (Sandbox Code Playgroud)

单例.cpp

Singleton& Singleton::getInstance()
{
    static Singleton instance;
    return instance;
}


std::string Singleton::getMessage(std::string code)
{
    /// Do something
    return "Code example.";
}
Run Code Online (Sandbox Code Playgroud)

和主要代码:

主程序

int main()
{
        Singleton* my_singleton;
        my_singleton = Singleton::getInstance(); **<-- ERROR HERE**

        cout << my_singleton->getMessage("a"); << endl

}
Run Code Online (Sandbox Code Playgroud)

主要是给我一个错误: Cannot convert 'Singleton' to 'Singleton*' in …

c++ singleton

0
推荐指数
1
解决办法
3472
查看次数

extjs全局变量总是返回原始值

我试过像这样制作一个extjs全局变量类:

Ext.define('ccc.global.GlobalVariables', {
    singleton: true,
    username: 'hi user',
    password: '',
    clientID: '',
    token: ''
});
Run Code Online (Sandbox Code Playgroud)

然后在控制器中我尝试更改变量,如下所示:

ccc.global.GlobalVariables.username = loginData.username;
Run Code Online (Sandbox Code Playgroud)

现在我试图在不同的模型代理中访问这些变量,并且它不断返回原始值'hi user'.

proxy: {
    type: 'ajax',
    extraParams: {
        'username': ccc.global.GlobalVariables.username
    },
Run Code Online (Sandbox Code Playgroud)

有谁看到我做错了什么?

singleton extjs global-variables

0
推荐指数
1
解决办法
116
查看次数

两次继承自泛型类

我有两节课

public class Singleton<T> : MonoBehaviour   where T : Component
{
    protected static T _instance;


    public static T Instance
    {
        get
        {
            return _instance;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

public class GameManager : Singleton<GameManager>
{
    // Lots of Methods and Properties...
}
Run Code Online (Sandbox Code Playgroud)

我想创建3.从GameManager派生的类,例如ShooterGameManager.我可以创建ShooterGameManager

public class ShooterGameManager : GameManager
{}
Run Code Online (Sandbox Code Playgroud)

但是实例仍然是GameManager !!!,我尝试过用类通用类添加额外的类定义.

public class GameManager<T> : Singleton<T> where T : Component
{}
Run Code Online (Sandbox Code Playgroud)

但是这次有两个完全不同的类可用,没有从GameManager继承.我该怎么办 ???

c# singleton instance generic-programming unity-game-engine

0
推荐指数
1
解决办法
185
查看次数

防止物体立即被摧毁

我试图创建一个类对象的单个实例,以便通过包含标头和调用方法的适当形式,使这个实例可以访问任何其他需要它的类getInstance().我试图通过遵循此处显示的Singleton示例来实现此目的,但由于某种原因,这个单个实例在创建后就会被销毁.

下面是头文件的副本, Window.h

#pragma once

#include <string>
#include <SDL.h>

class Window {

public:
    static Window* getInstance();
    static Window* getInstance(const std::string &title, int width, int height);
private:
    Window(const std::string &title, int width, int height);
    ~Window();

    bool init();

    std::string _title;
    int _width = 800;
    int _height = 600;

    SDL_Window *_window = nullptr;

    static Window *_instance;
    // static Window _solidInstance;
};
Run Code Online (Sandbox Code Playgroud)

下面是源文件,Window.cpp其中一些不相关的部分被删除以节省空间.

#include "Window.h"
#include <iostream>

Window* Window::instance = 0;
SDL_Renderer *Window::_renderer = nullptr;

Window::Window(const std::string &title, …
Run Code Online (Sandbox Code Playgroud)

c++ singleton pointers

0
推荐指数
1
解决办法
269
查看次数

从类成员返回智能指针的正确方法?

我正在尝试在person类中编写单例模式,这使我能够为该类创建一个实例,并且我可以在我的程序中的任何位置使用它.

以下是班级:

// The declaration
class Person {
    static unique_ptr<Person> instance;
    Person() = default;
    Person(Person&) = delete;
    Person& operator=(const Person&) = delete;
    ~Person() = default;
public:
    static unique_ptr<Person> getInstance();
};

// The implementation   
unique_ptr<Person> instance = NULL;
unique_ptr<Person> Person::getInstance() {
    if (instance == NULL) {
        instance = unique_ptr<Person>(new Person());
    }
    return instance;
}
Run Code Online (Sandbox Code Playgroud)

但它给我这个错误的问题: Error C2280 'std::unique_ptr<Person,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function

不幸的是,我不明白这个问题,我不知道如何解决?

c++ singleton smart-pointers c++11

0
推荐指数
1
解决办法
249
查看次数

Meyers Singleton:静态关键词混淆

考虑下面一段代码,它基本上是迈耶单身人士的一个例子(希望如此)

static const std::string& foo() // Line 1
{
   static std::string str("foo");
   return str;
}
Run Code Online (Sandbox Code Playgroud)

第1行中提到的静态关键字是否无意义?如果是这样的话?

c++ singleton visual-c++ c++11

0
推荐指数
1
解决办法
97
查看次数

如何防止多个线程在cpp中同时使用单例类实例

我正在编写一个线程安全的单例类,如下所示.以下实现确保只创建了一个类的实例.我的用例是我在多线程环境中使用此实例,其中每个线程可以getInstance()使用该实例调用并执行一些工作.我的问题是如何确保在特定时间只有一个线程正在使用该实例,以防止在多个线程同时尝试使用单个实例时可能发生的竞争条件.

class Singleton {
    Singleton() {}
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
 public:
    static Singleton& getInstance() {
        static Singleton s;
        return s;
    }
};
Run Code Online (Sandbox Code Playgroud)

c++ singleton multithreading design-patterns

0
推荐指数
1
解决办法
175
查看次数

单例类(也是单例)中是否有静态类?

我试图了解在Java 8中,控制器中的嵌套静态类(单例类)是否也是静态的,并且可以在请求之间共享?

这是我正在清理的旧代码,因为可能存在争用条件:控制器具有多个私有字段。每当请求到达控制器时,我便将它们移到静态嵌套类并创建该类的实例。然后,我将该对象传递给私有方法进行计算。

有人告诉我,单例中的静态嵌套类在内存中仅具有该子类的一个实例,如果遇到2个请求,则第二个实例仍然存在。还被警告说有人可以将这个静态类移到外面,这不是采取(?)的好方法

关于静态类和单例之间的区别,有很多答案。在Oracle文档上已经发现:实际上,静态嵌套类在行为上是顶级类,为了包装方便,该顶级类已嵌套在另一个顶级类中。

===但是我还没有发现有关静态嵌套类的任何信息===

我尝试了一下:在handleRequest中暂停一个线程,然后启动第二个线程,发现静态嵌套类的实例不同并且包含不同的值。给定文档,这就是我所期望的,但是我不确定,因为我找不到关于静态嵌套类WITHIN SINGLETON的任何信息。

我想念什么吗?这有可能会失败吗?有更好的解决方案吗?

public class MyController extends WebContentGenerator implements Controller {

  @Override
  public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
  {
    ReportParameters params = new ReportParameters();
    initVars(request, params);
    doWork(params);
    return null;
  }

  private void initVars(HttpServletRequest request, ReportParameters params)
  {
    params.flag = "Y".equals(request.getParameter("flag"));
    params.message = "Hello world";
  }

  private void doWork(ReportParameters params)
  {
    if (params.flag)
      params.message = "foo";
  }

  private static class ReportParameters
  {
    private boolean flag;
    private String message;
  }
}
Run Code Online (Sandbox Code Playgroud)

java singleton static nested class

0
推荐指数
1
解决办法
37
查看次数

从具有正向声明的类中向具有朋友功能的已声明单身类转发

我希望这是一个连贯的问题...我有一个单例类定义,例如:

#include A.h

class Singleton
{
public:
   // If I change this to a return by pointer, it works fine. But reference gives me problems.
   static Singleton &getInstance();
   Singleton(Singleton const&) = delete;
   void operator=(Singleton const&) = delete;
   ~Singleton();

   friend void A::friendMethodinA();
private:
   Singleton();
   void methodOnlyNeededByA();
}
Run Code Online (Sandbox Code Playgroud)

类的定义是:

Singleton &Singleton::getInstance()
{
   static Singleton instance;
   return instance;
}

Singleton::~Singleton() {}

Singleton::Singleton() {}

void Singleton::methodOnlyNeededByA() { // method body. }
Run Code Online (Sandbox Code Playgroud)

我的A类声明是:

#pragma once

class Singleton;

class A
{
public:
   void friendMethodinA();
private:
   // …
Run Code Online (Sandbox Code Playgroud)

c++ singleton return friend-function c++11

0
推荐指数
1
解决办法
62
查看次数

如何对单例对象使用导入语句

下面的示例来自Akka的Hello World项目,可从此处给出的说明下载。

示例代码在AkkaQuickstart.scala文件中。Greeter和Printer类以及具有相同名称的对象都在com.example包下的同一文件中。

在Greeter类中,有两个import语句:

import Greeter._
import Printer._
Run Code Online (Sandbox Code Playgroud)

当所有这些对象都定义在同一包中的同一文件中时,为什么需要在Greeter类中导入Greeter和Printer?它们是必需的,因为如果删除了这些导入,则代码将无法编译。

此处有关导入的Scala文档规定如下:

“导入子句用于访问其他程序包中的成员(类,特征,函数等)。不需要访问子句来访问同一程序包的成员。” 但是在下面的代码中,即使所有类和对象都在同一包中,也需要导入。为什么需要导入?

同样,对于Printer类,有以下导入语句:

import Printer._
Run Code Online (Sandbox Code Playgroud)

对此主题的任何指导将不胜感激。

完整的示例代码如下:

//#full-example
package com.example

import akka.actor.{ Actor, ActorLogging, ActorRef, ActorSystem, Props }

//#greeter-companion
//#greeter-messages

object Greeter {
  //#greeter-messages
  def props(message: String, printerActor: ActorRef): Props = Props(new 
  Greeter(message, printerActor))
  //#greeter-messages
  final case class WhoToGreet(who: String)
  case object Greet 
 }

//#greeter-messages
//#greeter-companion

//#greeter-actor
class Greeter(message: String, printerActor: ActorRef) extends Actor {
import Greeter._    //*why is import required here?*
import Printer._    //*why is import …
Run Code Online (Sandbox Code Playgroud)

import singleton scala akka

0
推荐指数
1
解决办法
64
查看次数