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