C++设计模式之三 单例模式

《Singleton.h》

#include<iostream>

#include<string>
using namespace std;


class A{
public:
    static A* GetInstance();
    void ShowAddress();


private:
A();
virtual ~A();
static A* m_p;

};


《Singleton.cpp》

#include "Singleton.h"


A*A::m_p = NULL;


A::A()
{
    cout <<"Construct Fun"<<endl;
}


A::~A()
{
delete m_p;
    cout <<"Deconstruct Fun"<<endl;
}


A* A::GetInstance()
{
    if ( m_p == NULL )
{
        m_p = new A();
    }
    return m_p;
}


void A::ShowAddress()
{
cout <<"SHOW AS"<<endl;
}


int main()
{
A::GetInstance()->ShowAddress();
return 0;
}


总结特点:

1、单例模式要求只能声明一个对象实例,为了保证则将构造函数声明为私有。

2、声明一个私有成员static对象实例指针,并在定义时初始化。

3、声明一个public的static成员函数,作用来获取该实例,在该函数定义时候,需要时创建实例。


调试时候遇到的问题:

在定义实例获取函数时候,我将该函数写成

static A* A::GetInstance()
{
    if ( m_p == NULL )
{
        m_p = new A();
    }
    return m_p;
}

加了一个“static”结果导致链接时候出错,提示“static' should not be used on member functions defined at file scope”,后来查资料才明白,此处不能加static。

总结原因如下:

问题原因:static 不能在文件区域内定义!也就是说不能在类里面定义,必须先在类里面声明然后在类外定义!

简单的说,static是针对于类的,而不是对象的,所有的对象都使用该static,原在类中声明的static成员函数,如果在定义时,加上static修饰符的话,每个对象都来操作属于所有对象(类)的东西,岂不是会乱套,所以不能允许这种行为。同理,针对于static变量一样,定义时不能加static。

下面来自于网友针对于该问题的分析,我感觉很有道理,贴过来学习一下:

错误提示:pure specifier can only be specified for functions

问题原因:不能在类里边赋static数据成员的初值

错误提示:'static' should not be used on member functions defined at file scope

问题原因:static 不能在文件区域内定义!也就是说不能在类里面定义,必须先在类里面声明然后在类外定义!

 

总结(转载如下)

1.         静态数据成员static data member 是 类的,而不是仅属于某个对象的,该类的所有对象都可以调用它,类也可以调用。对象可调用它,但不是独占。生存期:编译时就分配,程序结束才释放空间。他只能在类体外初始化。作用域:与定义它的类的作用域相同,即与类同在。他的存在是为了对象间的共同交流。

2.         静态成员函数Static member function 是为了调用static data member 而存在。Compile 不为他分配this 指针,所以他不能调用对象 的非static data member。当你非要调用 非Static data member 时,只要 指明对象就行了(因为没有compile 没有为类的static member function 指定 this 指针,所以引用 非静态成员变量时分不清是哪个对象的,当你指明对象来调用不就行了。)

 

加了static 限制符的data member or member function 只是限制了调用的权利,并没有限制 被调用的权利。非static 的对象和非static的member function 都可以调用他们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436088.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle停止trace日志,关闭ORACLE客户端trace日志

TRACE时的注意事项1、确保所需trace组建的配置文件存在缺省情况下&#xff0c;Oracle会从下列位置搜索网络配置文件a.TNS_ADMIN environment variable (incl. Windows Registry Key)b./etc or /var/opt/oracle (Unix)c.$ORACLE_HOME/network/admin (Unix)d.%ORACLE_HOME%/Netwo…

随手小记·080911

随手小记 郑昀玩聚SD(科技、体育、娱乐)&#xff1a;1&#xff1a; 叙事逻辑的来历 在我漫长的Blog阅读史中&#xff0c;我整理出自己两种最常用的阅读方式&#xff1a;按照热点主题的阅读方式&#xff0c;跳过大段大段阐述直接阅读文中最经典的话&#xff0c;于是&#xff0c;…

【转】03.Dicom 学习笔记-DICOM C-Get 消息服务

转自&#xff1a;https://www.jianshu.com/p/c7f5b9fa597c 引言 前篇介绍了 DICOM C-Find 消息服务&#xff0c;本文结合开源 DICOM 库 fo-dicom 详细介绍一下 C-Get 服务。 C-Get 消息服务 C-Get 服务主要用于获取影像&#xff0c;用于一个 DIMSE-service-user 在同等的DIMSE…

php dao类设计,DAO数据访问对象设计 - GoFrame官网 - 类似PHP-Laravel, Java-SpringBoot的Go企业级开发框架...

关于DAO数据访问对象设计其实是关于GoFrame框架工程化实践中比较重要一块设计。DAO设计结合GoFrame的ORM组件性能和易用性都很强&#xff0c;可以极大提高开发和维护效率。看完本章节内容之后&#xff0c;小伙伴们应该能够理解并体会到使用DAO数据库访问对象设计的优点。一、现…

再谈“我是怎么招聘程序员的”

我以前写过一篇“我是怎么招聘程序员的”的文章&#xff08;在CSDN那里有很多人进行了回复&#xff09;。今天&#xff0c;我想再谈谈关于招聘和面试这方面的东西&#xff0c;主要是以下这些原因&#xff1a; 近半年来我在进行了大量的招聘工作&#xff0c;对面试有一些新的体…

[SAP FI] Bank Master Vendor Master Creation Related Knowledge

*. Bank Key含义 Q : 国外的一个客户想要做Automatic Banking,需要输入bank key 和bank account在供应商主数据中, 问题是银行中文名字只能作为地址输入, 现在是关键的Bank key使用银行的英文简写加拼音的组合,比如中国工商银行上海分行,就使用ICBC_SH来代替这样子.而bank ac…

【转】DICOM图像像素值、灰度值与CT值!!!!!

转自&#xff1a;https://blog.csdn.net/syz201558503103/article/details/107238940 做医学图像处理会涉及DICOM图像&#xff0c;初学者应该要对图像像素有一定了解&#xff0c;在对像素处理中会一些算法会利用的更好。 图像灰度值的概念是什么&#xff1f;灰度也可以认为是…

linux服务器cc防御,Linux下简单的防止CC攻击

Nginx 0.7开始提供了2个限制用户连接的模块&#xff1a;NginxHttpLimitZoneModule和NginxHttpLimitReqModule。NginxHttpLimitZoneModule可以根据条件进行并发连接数控制。NginxHttpLimitReqModule可以根据条件进行请求频率的控制。http {limit_zone my_zone $binary_remote_ad…

深入浅出单实例Singleton设计模式

深入浅出单实例Singleton设计模式 陈皓 前序 单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了&#xff0c;这可能也是面试中问得最多的一个设计模式了。这个设计模式主要目的是想在整个系统中只能出现一个类的实例。这样做当然是有必然的&#xff0c;比如…

一直追求技术好吗?

我在大一的时候开始接触了编程&#xff0c;一直到现在&#xff0c;都是个技术的狂热追求者。从最开始的数据结构到现在的设计模式&#xff0c;经常是一连好几天一直在看资料、写代码&#xff0c;疯狂得连做梦也在想着怎么写代码。我同时也是个新技术的追随着&#xff0c;javasc…

【转】04.Dicom 学习笔记-DICOM C-Move 消息服务

引言 前篇介绍了 DICOM C-Get 消息服务&#xff0c;本文结合开源 DICOM 库 fo-dicom 详细介绍一下 C-Move 服务。 C-Move 消息服务 C-Move 服务可以用来获取影像和转存影像&#xff0c;用于一个 DIMSE-service-user 在同等的 DIMSE-service-user 上查询复合 SOP 实例的属性满足…

linux rar命令没找到,Linux没有rar解压命令

使用微软系统的同学都知道rar解压缩软件&#xff0c;它是一个商业的收费软件&#xff0c;那在免费开源的linux系统怎么解压后缀为rar的文件呢&#xff0c;我相信很多同学都是先把rar的文件下载到电脑本地&#xff0c;然后再用7-zip或者winrar 等等解压缩软件解压再压缩为zip的文…

PID是什么?在做系统的故障排除时如何使用它?

PID Process Identifier, 是一个全局唯一的用来标识进程的整数。在多任务系统中&#xff0c;可用来诊断系统中发生错误的进程。转载于:https://www.cnblogs.com/zhangliang2121/archive/2008/09/17/1292510.html

【转】05.Dicom 学习笔记-DICOM C-Echo 消息服务

引言 经过前面几篇的介绍&#xff0c;DIMSE-C 消息服务这块已经讲解了差不多了&#xff0c;还剩最后一个 C-Echo 消息服务&#xff0c;这个服务相对前面的4个服务来说更简单一些&#xff0c;本文结合开源 DICOM 库 fo-dicom 详细介绍一下 C-Echo 服务。 C-Echo 消息服务 首先来…

查看linux不显示ip,linux系统查看IP地址,不显示IP地址或者只显示127.0.0.1

LUA学习笔记三&&num;183&semi;时间等操作系统库1.构造时间 2.时间制定格式输出 3.计时器(闭包)os.difftime (t2, t1) 返回以秒计算的时刻 t1 到 t2 的差值. (这里的时刻是由 os.time 返回的值). 在 POS ...String定义与方法//5种构造方法 public void Con(){ Strin…

哪些设计模式最值得学习

最近又在首页看到几篇设计模式相关的学习随笔。回想起来&#xff0c;这几年在园子里发布的有关设计模式的随笔都有一个共同的特点。那就是Factory和Singleton居多&#xff0c;如果是系列的&#xff0c;也往往是从这两个模式开始的。由于能够坚持把《设计模式》中所有模式都写完…

【转】000.DICOM:DICOM标准学习路线图(初稿)!!!!!!!!!!!!

转自&#xff1a;https://zssure.blog.csdn.net/article/details/49231303 题记&#xff1a; DICOM医学图像处理专栏撰写已有两个年头&#xff0c;积累了近百篇文章。 起初 只是用于记录自己科研、工作中遇到的疑难问题&#xff0c;专注于图像处理&#xff08;主要是医学图像…

linux mysql关闭启动不了了,linux启动或关闭mysql失败的解决办法

linux启动或关闭mysql时提示&#xff1a;Warning: World-writable config file /etc/my.cnf is ignored.什么鬼&#xff1f; 意思是&#xff1a; 警告&#xff1a;全世界都能写的一个配置文件已经被我给忽略了。什么要忽略&#xff1f;因为mysql觉得他太low了&#xff0c;不安全…

对比 SQL Server 2005 和 Oracle

在 Microsoft Windows Server 上运行的 SQL Server 2005&#xff0c;为企业级关系数据库和分析解决方案提供了一个平台&#xff0c;在安全、可用性、与 Visual Studio 的整合度&#xff0c;从小企业到大企业的可扩展性以及低费用方面胜过了Oracle 10g。探索下列信息以发现在 这…

C++设计模式之四 模板模式

《TemplateMethod1.h》 #include <iostream> #include <string> using namespace std;class A{public:A(){};virtual ~A(){};void Method();protected:virtual void b() 0;virtual void c() 0;};class B: public A{public:B(){};virtual ~B(){};protected:voi…