C++类 单例模式

例子

请看如下的类和调用:

在您提供的代码片段中,CPathPlanMan 类使用了一个单例模式,这意味着这个类只需要一个实例,并且提供了全局访问点来获取这个实例。这通常用于控制对一个类实例的访问,尤其是在创建实例代价昂贵或者需要严格控制实例数量的情况下。

在单例模式中,类的构造函数通常是私有的,这防止了外部使用 new 关键字直接实例化类。相反,类提供了一个静态的公有方法 GetPathPlanManInstance,这个方法返回类的唯一实例。

您的代码中的确有一些问题和不一致之处,需要进行一些修正:

  1. 构造函数和析构函数应该是私有的,以确保外部不能直接实例化。
  2. GetPathPlanManInstance 方法已经正确地返回了类的唯一实例。
  3. 您需要在类中实现 init, ReInitial, 和 ReInitVW 方法。
  4. m_PpParamm_PlanMapServer 成员变量应该在类的构造函数中初始化。

下面是一个根据您的代码片段修正后的 CPathPlanMan 类的示例:

cpp 复制代码
#include <iostream>
#include <string>

class CPathPlanMan
{
private:
    CPathPlanMan(void) {
        // 初始化成员变量
        m_PpParam = CPathPlanParam(); // 假设CPathPlanParam有一个默认构造函数
        m_PlanMapServer = new PlanMapServer(); // 假设PlanMapServer有一个默认构造函数
    }

    virtual ~CPathPlanMan(void) {
        // 清理资源
        delete m_PlanMapServer;
    }

public:
    static CPathPlanMan& GetPathPlanManInstance() {
        static CPathPlanMan instance;
        return instance;
    }

    bool init() {
        // 实现初始化逻辑
        return true;
    }

    bool ReInitial(string & strFailUpdateFileName) {
        // 实现重新初始化逻辑
        return true;
    }

    bool ReInitVW() {
        // 实现VW重置逻辑
        return true;
    }

    // 其他成员函数和成员变量...

};

// 使用示例
int main() {
     CPathPlanMan& pathPlanMan = CPathPlanMan::GetPathPlanManInstance();
   
    // 调用类成员函数,不需要实例化
   pathPlanMan.init();

    return 0;
}

在这个修正后的代码中,我们确保了构造函数和析构函数是私有的,并且提供了一个全局访问点来获取 CPathPlanMan 的唯一实例。通过这种方式,您可以在不需要实例化类的情况下调用类的成员函数。

请注意,我在类中添加了一个虚拟析构函数(virtual ~CPathPlanMan(void)),这是为了确保当派生类中覆盖了析构函数时,可以通过基类指针正确地调用派生类的析构函数。如果 CPathPlanMan 没有派生类,这个虚拟析构函数可能不是必需的。

可以直接调用 CPathPlanMan::GetPathPlanManInstance().init(); 来初始化 CPathPlanMan 类的实例。在单例模式中,因为 GetPathPlanManInstance 方法返回类的唯一实例的引用,您可以使用该引用来访问和调用类的公有成员函数。

在您的代码中,调用 CPathPlanMan::GetPathPlanManInstance().init(); 可以直接初始化类的实例,而无需将其赋值给变量。

以下是您可以在 main 函数中直接初始化 CPathPlanMan 并调用 init 方法的示例:

cpp 复制代码
int main() {
    // 直接调用init方法对单例进行初始化
    CPathPlanMan::GetPathPlanManInstance().init();

    return 0;
}

这样,您就可以通过静态方法 GetPathPlanManInstance 获得 CPathPlanMan 的唯一实例,并立即调用 init 方法来初始化这个实例。这样使用单例模式可以方便地访问 CPathPlanMan 类的方法和成员。

使用单例模式的好处?

单例模式(Singleton Pattern)是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在单例模式中,通常会有以下几个关键点:

  1. 构造函数私有化 :确保类的外部无法通过 new 关键字直接创建对象实例。
  2. 全局访问点 :提供一个静态的公有方法(例如 GetPathPlanManInstance),用于获取类的唯一实例。
  3. 实例化延迟 :实例化通常推迟到第一次调用 GetPathPlanManInstance 方法时进行。
  4. 单一实例:确保类只有一个实例,并通过全局访问点返回这个实例。

在您提供的代码中,CPathPlanMan 类使用了一个单例模式,具体实现如下:

  • 构造函数是私有的,这意味着外部代码不能直接调用 new CPathPlanMan 来创建对象实例。
  • 提供了一个静态的公有方法 GetPathPlanManInstance,这个方法返回 CPathPlanMan 类的唯一实例。
  • 实例化过程是延迟的,即第一次调用 GetPathPlanManInstance 方法时才创建实例。

这样,无论你在代码中的哪个位置,只要通过 CPathPlanMan::GetPathPlanManInstance() 就可以获取到 CPathPlanMan 的实例,而无需关心实例是否已经创建。这种模式在某些情况下非常有用,比如当你需要一个全局管理器或者控制器时。

在您的代码中,单例模式的实现确保了 CPathPlanMan 类的行为和状态可以被全局控制,同时避免了因重复实例化导致的资源浪费或不一致状态

相关推荐
charlie1145141919 分钟前
深探std::vector:三指针、扩容与迭代器失效
开发语言·c++·开源项目
laplaya18 分钟前
ROS常用消息之PointCloud2
c++
asyxchenchong88834 分钟前
R语言混合效应(多水平/层次/嵌套)模型及贝叶斯实现技术应用
开发语言·r语言
熊猫钓鱼>_>41 分钟前
从“串数据“焦虑到 Space 自由,我用 Agent Bucket 智能体桶管游戏素材
开发语言·人工智能·游戏·agent·bucket·workbuddy·space
沙盘客1 小时前
典型应用与趋势:作战实验、AI 决策与数字孪生
c++·人工智能·经验分享
heimeiyingwang1 小时前
【架构实战】Kubernetes网络模型深度解析:从Pod通信到Ingress网关实战
开发语言·架构·php
ShineWinsu2 小时前
对于 C++ :从 const、constexpr、auto、decltype 到 type_traits、SFINAE 与 Concepts的解析
c++
luj_17682 小时前
变频技术核心原理揭秘
服务器·c语言·开发语言·经验分享·算法
_Narcissus_2 小时前
B树概念及操作笔记(含完整代码实现)
c语言·数据结构·数据库·c++·笔记·b树·算法