在Singleton类的情况下我应该如何编写复制构造函数?如何重载=运算符?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Singleton类的情况下我应该如何编写复制构造函数?如何重载=运算符?相关的知识,希望对你有一定的参考价值。

我应该如何为我的单例类编写一个复制构造函数,以防止创建一个新对象,因为我已经有了一个。什么是overload = operator的最佳实践

 #include <iostream>
 #include <stdio.h>
 #include <conio.h>

 using namespace std;

 class Rect
 { 
  int length;
  int breadth;
  static int count;
  static int maxcount;
  Rect()
  {};
  Rect(const Rect& abc){};
  public :

      ~Rect();
      int area_rect()          
      {return length*breadth;}
      void set_value(int a,int b);

      static Rect* instance()
      {     
            Rect* ptr=NULL;
            if(count < maxcount)
            {
              ptr=new Rect ;
              count++;
            }
             return ptr;
       }
     };
    int Rect::count = 0;
    int Rect::maxcount = 1;
    void Rect::set_value(int a,int b)
   {
    length=a;
    breadth=b;
   }
  Rect::~Rect()
  {
   count --;          
  }  
 int main()
 {
  Rect* a= Rect::instance();  //creates first object
  // Rect* c= Rect::instance();  //fails to create second object 
  //as maxcount=1 and returns NULL
  a->set_value(10,3);
 cout << "area realted to object a : "  << a->area_rect() <<"
"; 
 Rect* b=a;//allows creation of second object which I dont want
 b->set_value(10,4);
 cout << "area realted to object b : "  << b->area_rect() <<"
"; 
 delete a;
 delete b;
 getch();
 return 0;
}       

如何编写复制构造函数代码并重载相等的运算符以防止创建更多对象?

答案

要么使其不可复制,如此处所述

How do I make this C++ object non-copyable?

或者您定义复制构造函数和赋值运算符,以便获得相同的单例。取决于您实际需要的功能。

通常也应该禁止分配(如上面的链接):

class Rect{
     Rect( const Rect& ) = delete;
     Rect& operator=( const Rect& ) = delete;
     . . .
}

这也禁止移动操作。

你可能也想知道这个:Are Singletons really that bad?

另一答案

单身人士很荒谬,只需使用免费功能。

仍然,回答你的问题......

C ++ 11:

class Foo {
public:
    Foo (const Foo &) = delete;
    Foo & operator = (const Foo &) = delete;
};

C ++ 03;

class Foo {
private:
    // Don't write bodies.
    Foo (const Foo &);
    Foo & operator = (const Foo &);
};
另一答案

以下是相关答案:如果您不希望有人创建对象,请不要给他们公共构造函数!

说真的,你可以拥有一个工厂对象,使它成为你想要限制构造的类的朋友,并使该类的构造函数成为私有的。这样,访问对象的唯一方法(此时甚至不必创建它)将通过您的工厂。

EG

#include <boost/noncopyable.hpp>
#include <string>

class ConnectionFactory;

class DatabaseConnection : boost::noncopyable {
  // can only be created by ConnectionFactory which happens to 
  // know how to connect to our database server!
  friend class ConnectionFactory;
  DatabaseConnection(std::string username, std::string password /*etc*/);
  // don't want any random user to reset the connection!
  ~DatabaseConnection();

public:
  // public interface bits
  void Execute(const Select&);
  // ...
};

ConnectionFactory {
public:
  DatabaseConnection& conn();
};

class MayNeedDbConnection {
  ConnectionFactory factory;
public:
  explicit MayNeedDbConnection(const ConnectionFactory& f) : factory(f)
  {}

  void SelectStuff() {
    DatabaseConnection& conn = factory.conn();
    conn.Execute(....);
  }
};

int main()
{
  ConnectionFactory factory;
  MayNeedDbConnection md(factory);
  md.SelectStuff();
}

以上是关于在Singleton类的情况下我应该如何编写复制构造函数?如何重载=运算符?的主要内容,如果未能解决你的问题,请参考以下文章

在啥情况下我应该使用尝试而不是二叉树/哈希表? [复制]

函数返回一个指向对象的指针,在这种情况下我应该返回啥?

Singleton类的优势是啥? [复制]

Angular 指令:在这种情况下我应该使用结构还是属性?

虚析构函数与纯虚函数

如何在派生类中实现类的基本函数