微信扫一扫

028-83195727 , 15928970361
business@forhy.com

如何定义一个只能在堆上生成对象的类

如何定义一个只能在堆上生成对象的类2016-11-10

  如何定义定义一个只能在堆上生成对象的类???

  这种题主要考的是对C++语法的理解,以及对C++语法的运用。

分析:
  对象可以在栈上生成也可以由我们在堆上new出来。要想只在堆上生成对象而不能在栈上生成对象在类外是

无法完成的,我们必须从类的内部入手。

  我们知道类对象的构造是由构造函数完成的,如果我们把构造函数声明为保护的,使得不能在类外调用构造

函数,这样的话在类外就不能从栈上生成对象了,但这同时也不能在类外new出对象了。

  为此,我们可以在类内new一个对象并提供一个公有的接口来返回这个对象。接下来如果在类外定义类对象

的话,只需要调用这个函数即可。貌似这样做还是行不通,因为在类外只能由类对象调用类成员函数,这该怎

么办呢???

  我们可以将这个接口声明为静态成员函数,这样就可以了。

例:
class AA
{
public:
       static AA* GetObject(int a)
       {
              return new AA(a);
       }
       ~AA()
       {
              delete this;
       }
protected:
       AA(int a)
       {
              _a = a;
       }
private:
       int _a;
};
void test()
{
       AA *a = AA::GetObject(10);
}



我们还可以把析构函数声明为私有的,然后再提供一个访问析构函数的公有接口即可:
class AA
{
public:
       void destory()
       {
              delete this;
       }
private:
       ~AA()
       {
       }
};
void test2()
{
       AA *a=new AA;              //可以
       a->destory();
}