2013-11-15 singelton的实现及学习的笔记

来源:互联网 发布:大数据如何分析 编辑:程序博客网 时间:2024/05/29 19:14

  singelton要实现肯定是需要将构造函数设置为私有,再通过开放一个接口,限制只能存在一个对象。记得当时说在这个时候,拷贝构造函数也需要封住,但是后面想想不知道为什么?现在仍然不知道为什么

今天发现的问题如下:

一、关于拷贝构造函数,静态方法返回的是一个指针,在此时什么情况下才会调用拷贝构造函数?所以为什么要封掉拷贝构造函数?【未解决】

在实现singleton的时候,编写了一个Boss.h文件,代码如下

#ifndef BOSS_H_INCLUDED#define BOSS_H_INCLUDED#include<iostream>using namespace std;class Boss{private:    static Boss* boss;    int hp;    char* name;    int level;    Boss();Boss(const Boss&){};//拷贝构造函数,不知道为什么这里也需要封住    ~Boss();public:    static Boss* singleton();    void setHp(int);    void setName(char*);    void setLevel(int);    void paint();    static void destructBoss();};#endif // BOSS_H_INCLUDED
Boss.cpp文件如下

#include "Boss.h"Boss* Boss::boss=NULL;//类静态成员变量的真正定义Boss::Boss(){    name=new char[20];}Boss::~Boss(){    delete name;}void Boss::setHp(int number){    if(hp>0){        hp=number;    }    else{        hp=100;    }    }void Boss::setName(char* name){    int i=0;    while(name[i]!='\0'){        this->name[i]=name[i];        i++;    }    this->name[i]='\0';}void Boss::setLevel(int t){    level=t;}Boss* Boss::singleton(){    if(boss==NULL){        boss=new Boss();    }    return boss;}void Boss::paint(){    cout<<name<<" "<<hp<<" "<<level<<endl;}void Boss::destructBoss(){    delete boss;}
这样是对的。

二、当静态成员变量初始化放在.h文件中出现重定义?放在 cpp文件中就不存在,为什么?

初步猜测为即使在Boss.h中定义了预处理变量,但是当它被include至main.cpp时,此段代码被拷贝至main.cpp文件中,而当调用Boss.cpp中的方法,即在进行链接时,cpp中也include了该Boss.h文件,也有静态变量的定义,因此就出现了重定义,编译无法通过。当将静态变量的定义放入Boss.cpp中,链接一次就只出现一次定义。


三、在一个有参数的构造方法中调用了无参数的构造方法,但是后来发现这个调用和JAVA里面是不一样的,而且出现了对象销毁;后来查看别人的博客了解了是怎么一回事,调用构造函数相当于创建了一个新的对象,但想要创建的该对象本身属性是没有变的。但是还是不明白为什么会出现对象的销毁【未解决】参考他人的博客http://www.cnblogs.com/chio/archive/2007/10/20/931043.html

【今天明白了 #ifndefine BOSS_H这个有什么用了】