(十分古怪的问题)能够在类中实现一个创建该类的对象的函数吗?
能不能在一个类中实现一个成员函数,这个函数的作用就是创建一个类的对象,这样我可以调用这个函数来创建这个类的对象。看起来是画蛇添足,没事找事,可是如果真的能,那就救了我的命!:)
例如类:
class MyClass
{
public static void add(int a, int b)
{
result=a+b;
}
int result;
}
给这个类加一个怎样的函数能创建这个类的实例呢?
问题点数:20、回复次数:8Top
1 楼i_noname(晚九朝五)回复于 2006-05-04 17:33:31 得分 0
of cause we can, google singletonTop
2 楼xiaocai0001(高楼目尽欲黄昏/梧桐叶上萧萧雨)回复于 2006-05-04 17:41:40 得分 0
普通成员函数是不行的
但静态成员函数则是可行的.Top
3 楼shiyubeijing()回复于 2006-05-04 17:54:02 得分 0
普通的成员函数由于没有创建对象是不能被调用的(对吧?),而要想在创建对象之前就调用那应该是静态的。我会去看看singleton的。
具体能否结合我给定那个类给出具体的函数呢?
Top
4 楼houdy(致力于图像/图形领域,成为有思想的程序员)回复于 2006-05-04 18:07:22 得分 7
能不能在一个类中实现一个成员函数,这个函数的作用就是创建一个类的对象,这样我可以调用这个函数来创建这个类的对象。看起来是画蛇添足,没事找事,可是如果真的能,那就救了我的命!:)
>>>>> 你说的这种情况,并不是"画蛇添足,没事找事",因为在很多情况下,不使用构造函数,而使用成员函数来创建类的对象是有好处的,而且有时候还是必要的。
除了singleton模式中使用静态成员函数来创建类对象的实例外,我们还可以使用虚函数来创建一组类的对象,这种方法被称为"virtual constructor":
1.在基类中定义一个虚函数,返回基类的指针,例如:
class Base {
public:
virtual Base* clone();
}
2.在派生类中重写这个虚函数,返回派生类的指针,例如:
class Derived : public Base {
public:
virtual Derived* clone();
}
值得注意的是,虚函数返回类型不一致。在这种情况下,是允许的。
google "virtual constructor",或者访问这个网址:
http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.8
深入了解virtual constructorTop
5 楼sankt(宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒.)回复于 2006-05-04 20:17:07 得分 7
单件模式就是最好的例子:
#include<iostream>
using namespace std;
class Singleton
{
private:
static Singleton* instance;
Singleton()
{
cout<<"Singleton constructor."<<endl;
}
public:
static Singleton* create()
{
if(instance == NULL)
{
instance = new Singleton;
}
return instance;
}
~Singleton()
{
if(instance != NULL)
{
delete instance;
}
}
};
Singleton* Singleton::instance=NULL;
int main()
{
Singleton* one=Singleton::create();
Singleton* two=Singleton::create();
cout<<"The addr of one is "<<one<<endl;
cout<<"The addr of two is "<<two<<endl;
system("pause");
return 0;
}
Top
6 楼shiyubeijing()回复于 2006-05-04 22:05:02 得分 0
其实我是想做这样一个类然后弄成Dll,供别人调用,下面是我的代码,有问题,哪里错了呢?
//MyDll.cpp
class _declspec(dllexport) MyClass
{
private:
static MyClass* instance;
MyClass()
{
}
public:
static MyClass* create()
{
instance = new MyClass();
return instance;
}
};
这段代码我知道很不规范,但是只要能实现最基本的功能就行。这是在vc中建立的控制台Dll,编译连接出现错误:
AddDll.obj : error LNK2001: unresolved external symbol "private: static class MyClass * MyClass::instance" (?instance@MyClass@@0PAV1@A)
Debug/AddDll.dll : fatal error LNK1120: 1 unresolved externalsTop
7 楼qhgary(Gary)回复于 2006-05-05 01:17:50 得分 6
你的static变量需要初始化。
加上
MyClass* MyClass::instance = 0;
注意要在类的外面写。Top
8 楼yuanchuang(元创)回复于 2006-05-05 08:38:41 得分 0
看起来是画蛇添足,没事找事
---------------
不是画蛇添足,没事找事。
如果要限制构造函数的使用,就要用到这个方法了Top




