CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

(十分古怪的问题)能够在类中实现一个创建该类的对象的函数吗?

楼主shiyubeijing()2006-05-04 17:29:40 在 C/C++ / C++ 语言 提问

能不能在一个类中实现一个成员函数,这个函数的作用就是创建一个类的对象,这样我可以调用这个函数来创建这个类的对象。看起来是画蛇添足,没事找事,可是如果真的能,那就救了我的命!:)  
  例如类:  
  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

相关问题

关键词

得分解答快速导航

  • 帖主:shiyubeijing
  • houdy
  • sankt
  • qhgary

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo