Computer >> Máy Tính >  >> Lập trình >> C ++

Hàm tạo bản sao ảo trong C ++

Trước khi đi sâu vào các chủ đề, hãy tìm hiểu tất cả các thuật ngữ liên quan.

Một phương thức tạo bản sao là một loại phương thức khởi tạo đặc biệt được sử dụng để tạo một đối tượng là bản sao chính xác của đối tượng được truyền vào.

Một chức năng ảo là một hàm thành viên được khai báo trong lớp cha và được định nghĩa lại (ghi đè) trong lớp con kế thừa lớp cha.

Với việc sử dụng hàm tạo bản sao ảo, lập trình viên sẽ có thể tạo một đối tượng mà không cần biết kiểu dữ liệu chính xác của đối tượng.

Trong ngôn ngữ lập trình C ++, copy Constructor được sử dụng để tạo một đối tượng được sao chép từ một đối tượng khác. nhưng nếu bạn muốn chương trình quyết định trong thời gian chạy về loại đối tượng được tạo, tức là loại đối tượng đó được xác định trong thời gian chạy, không phải lúc biên dịch và dựa trên một số đầu vào do người dùng cung cấp cho một điều kiện nhất định. trong tình huống này, Chúng ta cần một hàm tạo bản sao với một số quyền năng đặc biệt để thực hiện điều này. Vì vậy, để làm điều này, hàm tạo bản sao ảo được khai báo cung cấp khả năng sao chép các đối tượng trong thời gian thực.

Hãy lấy một ví dụ, Giả sử chúng ta có một con số là khu vực sẽ được tìm ra bằng cách sử dụng chương trình. nhưng kiểu lên của một đối tượng được xác định là thời gian thực, nó có thể là một hình chữ nhật vuông hoặc một hình tròn. Vì vậy, chúng tôi sẽ sử dụng một hàm tạo bản sao ảo sẽ sao chép các đối tượng dựa trên kiểu mà người dùng đã nhập.

Để các hàm tạo ảo hoạt động bình thường, có hai phương thức được định nghĩa trên lớp cơ sở. họ là -

clone()
create()

Phương thức tạo bản sao sử dụng phương thức sao chép ảo trong khi phương thức tạo ảo được sử dụng bởi các phương thức tạo mặc định để tạo một phương thức tạo ảo.

Ví dụ

#include <iostream>
using namespace std;
class figure{
   public:
   figure() { }
   virtual
   ~figure() { }
   virtual void ChangeAttributes() = 0;
   static figure *Create(int id);
   virtual figure *Clone() = 0;
};
class square : public figure{
   public:
   square(){
      cout << "square created" << endl;
   }
   square(const square& rhs) { }
   ~square() { }
   void ChangeAttributes(){
      int a;
      cout<<"The side of square";
      cin>>a;
      cout<<"Area of square is "<<a*a;
   }
   figure *Clone(){
      return new square(*this);
   }
};
class circle : public figure{
   public:
   circle(){
      cout << "circle created" << endl;
   }
   circle(const circle& rhs) { }
   ~circle() { }
   void ChangeAttributes(){
      int r;
      cout << "enter the radius of the circle ";
      cin>>r;
      cout<<"the area of circle is "<<((3.14)*r*r);
   }
   figure *Clone(){
      return new circle(*this);
   }
};
class rectangle : public figure{
   public:
   rectangle(){
      cout << "rectangle created" << endl;
   }
   rectangle(const rectangle& rhs) { }
   ~rectangle() { }
   void ChangeAttributes(){
      int a ,b;
      cout<<"The dimensions of rectangle ";
      cin>>a>>b;
      cout<<"Area of rectangle is "<<a*b;
   }
   figure*Clone(){
      return new rectangle(*this);
   }
};
figure *figure::Create(int id){
   if( id == 1 ){
      return new square;
   }
   else if( id == 2 ){
      return new circle;
   }
   else{
      return new rectangle;
   }
}
class User{
   public:
   User() : figures(0){
      int input;
      cout << "Enter ID (1, 2 or 3): ";
      cin >> input;
      while( (input != 1) && (input != 2) && (input != 3) ){
         cout << "Enter ID (1, 2 or 3 only): ";
         cin >> input;
      }
      figures = figure::Create(input);
   }
   ~User(){
      if( figures ){
         delete figures;
         figures = 0;
      }
   }
   void Action(){
      figure *newfigure = figures->Clone();
      newfigure->ChangeAttributes();
      delete newfigure;
   }
   private:
   figure *figures;
};
int main(){
   User *user = new User();
   user->Action();
   delete user;
}

Đầu ra

Enter ID (1, 2 or 3): 2
circle created
enter the radius of the circle R 3
the area of circle is 28.26