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

  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这个有什么用了】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值