怎样让一个类只能有一个实例?(200分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
C

cAkk

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样让一个类只能有一个实例?
 
C++ 中可以定义静态的类变量,通过类变量可以限制类的实例个数,
Pascal 中我没做过,不只有没有类似的东东。
 
考虑在析构函数中加限制条件
 
什么析构,是构造!
在构造函数中加限制是肯定的,关键是如何判断已经有类实例存在了.
不知 Pascal 中有没有静态的变量,有的话定义一个,生成第一个实例的时候把它
置为真,以后要生成实例的时候判断一下就可以了。
 
没有类变量, 但有静态变量.
>> 置为真,以后要生成实例的时候判断一下就可以了
如果构造函数中发现该变量为真, 然后该如何处理?
 
处理的话就看需要了,简单的处理可以 Raise Exception.Create('对象已经存在! ');
 
我想不让它创建新实例, 但不要因为出错而执行失败, 又想直接通过访问它而可以访问原先的实例
 
自己设个全局变量不就是了,C++的静态成员函数就是全局变量
 
to z_cd:
我想在C++中这个可以通过重载 new 操作符来实现.
在类里建立一个private的静态成员,为指向该类的对象的指针类型, 并初始化为 NULL.
假设为 OneInstance* instance;
在构造函数中将 this 指针的数值复制给成员 instance.

在重载的 new 操作符中, 判断 instance 的值是否为 NULL
是则调用通常的 new 过程
否则返回该指针
 
xiao.lit: 不一定有用,因为很少有人会在new只前将指针赋空。一般地都是:

OneInstance *instance = new OneInstance;
或者
OneInstance *instance;

instance=new OneInstance;

很少会有人用:
OneInstance *instance;

instance=NULL;
instance=new OneInstance;

而且C++中对变量是不自动清0的,故初始的时候instance!=NULL
 
呵呵,CAkk 提的问题。
老兄好久不见了。

据我所知,Delphi 里面只有类方法,没有 C++ 的类变量(静态类变量)。
突然有一个想法:可不可以定义一个类方法,然后在类方法里面定义静态变量?因为 Delphi 支持
静态变量和类方法,如果把二者结合起来,结果会... ...
嘿嘿,仅供参考。
 
把类做入dll
 
To charlie chen: 真的吗?8-(
 
给你一段源代码, BC++ 3.1 下通过

#include <stdio.h>

class OneInstance
{
private:
static OneInstance* instance;
public:
void* operator new(size_t t = 1);
OneInstance();
int a;
};

OneInstance :: OneInstance(){
instance = this;
a = 1;
}

OneInstance * OneInstance :: instance = NULL;

void* OneInstance :: operator new(size_t t){
if(OneInstance::instance) return instance;
return ::new OneInstance [t];
}

int main()
{
OneInstance* p1,*p2;
p1 = new OneInstance;
p2 = new OneInstance;
p1->a++;
printf("%d", p2->a);

delete p1;
return 0;
}


跟踪进去发现 p1 和 p2 确实是指向同一个地址
 
Delphi 没有私有的类静态变量啊。
 
我知道C++的实现方式,我想要obj pascal的实现方法.
 
一样的呀,关键就是C++里的static变量等价于Delphi中的全局变量。

然后你重载一下constructor create函数就是了。

 
嘿嘿 Cakk ,这次我把分拿定了。
方法就是我上面所设想的那样,TObject 有一个类方法:
class function NewInstance: TObject
virtual;
我 override 了它:
TMyObj = class(TObject)
public
class function NewInstance: TObject
override;
end;
然后在它内部定义一个静态变量,并作如下修改:
class function TMyObj.NewInstance: TObject;
const Instance: TObject = nil;
begin
if Instance = nil then Instance := inherited NewInstance;
Result := Instance;
end;
再写一个测试程序:
var
Form1: TForm1;
Obj1, Obj2: TMyObj;

procedure TForm1.FormCreate(Sender: TObject);
begin
Obj1 := TMyObj.Create;
Obj2 := TMyObj.Create;
if Obj1=Obj2 then Showmessage('ok')
// Ok 显示出来了
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Obj1.Free;
//Obj2.Free
// 这句话必须注释掉,否则会引起异常,证明二者确实是一个对象
end;
 
〉const Instance: TObject = nil;
〉if Instance = nil then Instance := inherited NewInstance;
能赋值吗?

我觉得应该把它做成全局的放到Unit中
 
To JJams_King:
此 Const 非彼 Const ,用在这里是静态变量的意思。
不信,你自己试试看,反正我把代码都贴出来了。应该没有必要怀疑,因为这个程序我
运行通过了,不是瞎写的。
 
后退
顶部