Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Шаблоны классов С++

Шаблоны классов C++

В этом уроке мы узнаем о шаблонах классов в C++ с помощью примеров.

Шаблоны — это мощные функции C++, которые позволяют нам писать универсальные программы. Есть два способа реализации шаблонов:

Подобно шаблонам функций, мы можем использовать шаблоны классов для создания одного класса для работы с различными типами данных.

Шаблоны классов очень удобны, так как они могут сделать наш код короче и более управляемым.

<час>

Объявление шаблона класса

Шаблон класса начинается с ключевого слова template. за которым следует параметр(ы) шаблона внутри <> за которым следует объявление класса.

template <class T>
class className {
  private:
    T var;
    ... .. ...
  public:
    T functionName(T arg);
    ... .. ...
};

В приведенном выше объявлении T — это аргумент шаблона, который является заполнителем для используемого типа данных, и class ключевое слово.

Внутри тела класса переменная-член var и функция-член functionName() оба имеют тип T .

<час>

Создание объекта шаблона класса

После того как мы объявили и определили шаблон класса, мы можем создавать его объекты в других классах или функциях (таких как main() функция) со следующим синтаксисом

className<dataType> classObject;

Например,

className<int> classObject;
className<float> classObject;
className<string> classObject;
<час>

Пример 1. Шаблоны классов C++

// C++ program to demonstrate the use of class templates

#include <iostream>
using namespace std;

// Class template
template <class T>
class Number {
   private:
    // Variable of type T
    T num;

   public:
    Number(T n) : num(n) {}   // constructor

    T getNum() {
        return num;
    }
};

int main() {

    // create object with int type
    Number<int> numberInt(7);

    // create object with double type
    Number<double> numberDouble(7.7);

    cout << "int Number = " << numberInt.getNum() << endl;
    cout << "double Number = " << numberDouble.getNum() << endl;

    return 0;
}

Вывод

int Number = 7
double Number = 7.7

В этой программе. мы создали шаблон класса Number с кодом

template <class T>
class Number {
   private:
    T num;

   public:
    Number(T n) : num(n) {}
    T getNum() { return num; }
};

Обратите внимание, что переменная num , аргумент конструктора n , а функция getNum() имеют тип T или иметь тип возвращаемого значения T . Это означает, что они могут быть любого типа.

В main() , мы реализовали шаблон класса, создав его объекты

Number<int> numberInt(7);
Number<double> numberDouble(7.7);

Обратите внимание на коды Number<int>. и Number<double> в приведенном выше коде.

Это создает определение класса для каждого int и float , которые затем используются соответствующим образом.

Обязательно указывать тип при объявлении объектов шаблонов классов. В противном случае компилятор выдаст ошибку.

//Error
Number numberInt(7);
Number numberDouble(7.7);
<час>

Определение члена класса вне шаблона класса

Предположим, нам нужно определить функцию вне шаблона класса. Мы можем сделать это с помощью следующего кода:

template <class T>
class ClassName {
    ... .. ...
    // Function prototype
    returnType functionName();
};

// Function definition
template <class T>
returnType ClassName<T>::functionName() {
    // code
}

Обратите внимание, что код template <class T> повторяется при определении функции вне класса. Это необходимо и является частью синтаксиса.

Если мы посмотрим на код в Примере 1 , у нас есть функция getNum() который определен внутри шаблона класса Number .

Мы можем определить getNum() вне Number со следующим кодом:

template <class T>
class Number {
    ... .. ...
    // Function prototype
    T getnum();
};

// Function definition
template <class T>
T Number<T>::getNum() {
    return num;
}
<час>

Пример 2. Простой калькулятор с использованием шаблонов классов

Эта программа использует шаблон класса для выполнения сложения, вычитания, умножения и деления двух переменных num1. и число2 .

Переменные могут быть любого типа, хотя мы использовали только int и float типы в этом примере.

#include <iostream>
using namespace std;

template <class T>
class Calculator {
   private:
    T num1, num2;

   public:
    Calculator(T n1, T n2) {
        num1 = n1;
        num2 = n2;
    }

    void displayResult() {
        cout << "Numbers: " << num1 << " and " << num2 << "." << endl;
        cout << num1 << " + " << num2 << " = " << add() << endl;
        cout << num1 << " - " << num2 << " = " << subtract() << endl;
        cout << num1 << " * " << num2 << " = " << multiply() << endl;
        cout << num1 << " / " << num2 << " = " << divide() << endl;
    }

    T add() { return num1 + num2; }
    T subtract() { return num1 - num2; }
    T multiply() { return num1 * num2; }
    T divide() { return num1 / num2; }
};

int main() {
    Calculator<int> intCalc(2, 1);
    Calculator<float> floatCalc(2.4, 1.2);

    cout << "Int results:" << endl;
    intCalc.displayResult();

    cout << endl
         << "Float results:" << endl;
    floatCalc.displayResult();

    return 0;
}

Вывод

Int results:
Numbers: 2 and 1.
2 + 1 = 3
2 - 1 = 1
2 * 1 = 2
2 / 1 = 2

Float results:
Numbers: 2.4 and 1.2.
2.4 + 1.2 = 3.6
2.4 - 1.2 = 1.2
2.4 * 1.2 = 2.88
2.4 / 1.2 = 2

В приведенной выше программе мы объявили шаблон класса Calculator. .

Класс содержит два закрытых члена типа T. :число1 &число2 и конструктор для инициализации членов.

У нас также есть add() , subtract() , multiply() и divide() функции с возвращаемым типом T . У нас также есть void функция displayResult() который выводит результаты других функций.

В main() , мы создали два объекта Calculator :один для int тип данных и другой для float тип данных.

Calculator<int> intCalc(2, 1);
Calculator<float> floatCalc(2.4, 1.2);

Это побуждает компилятор создать два определения класса для соответствующих типов данных во время компиляции.

<час>

Шаблоны классов C++ с несколькими параметрами

В C++ мы можем использовать несколько параметров шаблона и даже использовать аргументы по умолчанию для этих параметров. Например,

template <class T, class U, class V = int>
class ClassName {
  private:
    T member1;
    U member2;
    V member3;
    ... .. ...
  public:
    ... .. ...
};
<час>

Пример 3. Шаблоны C++ с несколькими параметрами

#include <iostream>
using namespace std;

// Class template with multiple and default parameters
template <class T, class U, class V = char>
class ClassTemplate {
   private:
    T var1;
    U var2;
    V var3;

   public:
    ClassTemplate(T v1, U v2, V v3) : var1(v1), var2(v2), var3(v3) {}  // constructor

    void printVar() {
        cout << "var1 = " << var1 << endl;
        cout << "var2 = " << var2 << endl;
        cout << "var3 = " << var3 << endl;
    }
};

int main() {
    // create object with int, double and char types
    ClassTemplate<int, double> obj1(7, 7.7, 'c');
    cout << "obj1 values: " << endl;
    obj1.printVar();

    // create object with int, double and bool types
    ClassTemplate<double, char, bool> obj2(8.8, 'a', false);
    cout << "\nobj2 values: " << endl;
    obj2.printVar();

    return 0;
}

Вывод

obj1 values: 
var1 = 7
var2 = 7.7
var3 = c

obj2 values: 
var1 = 8.8
var2 = a
var3 = 0

В этой программе мы создали шаблон класса с именем ClassTemplate. , с тремя параметрами, один из которых является параметром по умолчанию.

template <class T, class U, class V = char>
class ClassTemplate {
  // code  
};

Обратите внимание на код class V = char. . Это означает, что V является параметром по умолчанию, тип которого по умолчанию — char. .

Внутри ClassTemplate , мы объявляем 3 переменные var1 , var2 и var3 , каждый из которых соответствует одному из параметров шаблона.

class ClassTemplate {
   private:
    T var1;
    U var2;
    V var3;
    ... .. ...
    ... .. ...
};

В main() , мы создаем два объекта ClassTemplate с кодом

// create object with int, double and char types
ClassTemplate<int, double> obj1(7, 7.7, 'c');

// create object with double, char and bool types
ClassTemplate<double, char, bool> obj2(8, 8.8, false);

Здесь

Объект Т Н В
obj1 int double char
obj2 double char bool

Для obj1 , T = int , U = double и V = char .

Для obj2 , T = double , U = char и V = bool .


Язык C

  1. C# статическое ключевое слово
  2. Вложенный класс С#
  3. Операторы С++
  4. С++ Комментарии
  5. Классы хранения в C++
  6. Полиморфизм в С++
  7. Абстракция данных в C++
  8. Инкапсуляция данных в C++
  9. Интерфейсы в C++ (абстрактные классы)
  10. Шаблоны С++