2013-11-29 2 views
-1

Я новичок в шаблоны и у меня есть некоторая troube понять этот кусок кодафункция члена шаблонного класса

template <typename T> 
class Item 
{ 
    T data; 
    public: 
    Item <T>():data(T()) 
    { 
    cout<<"inside constructor for Item class"<<endl;} 
    void setdata(T nvalue){ 
    data=nvalue; 
    } 
     Item <T> operator +(int s){ 
     return Item <T> (data + s); 
    } 
     T getdata() const 
     { 
     //T temp =data[0]; 
     return data; 
     } 
    void printdata() 
     { 
     cout<<data<<endl; 
     } 
}; 

Часть, которую я не понимаю, функцию

Item <T> operator +(int s){ 
    return Item <T> (data + s); 
} 

Я понимаю этот оператор «+» перегружен здесь, но я не понимаю, что является функцией Item <T> в заявке return и до operator + (int s)

+0

Вот конструктор, верно? – billz

+0

@billz Не знаю, я думал, что 'Item (): data (T())' был конструктором. – Gautam

+0

Я имею в виду, что он вызывает конструктор для создания объекта. – billz

ответ

1

Допустим, у вас есть этот код:

Item<int> myItem; 

Item<int> myItem2 = myItem + 3; 

Это будет создавать и экземпляр шаблона (это отличается от экземпляра класса)

Примечание: произошла ошибка в исходном коде, вам отсутствуют провозглашение consutrctor:

Item <T> (T num):data(num) 
{ 
    cout<<"inside constructor for Item class"<<endl; 
} 

Это будет выглядеть следующим образом:

class Item 
{ 
    int data; 
    public: 
     Item <int> (int num):data(num) 
     { 
      cout<<"inside constructor for Item class"<<endl; 
     } 

     Item <int>():data(int()) 
     { 
      cout<<"inside constructor for Item class"<<endl; 
     } 

     void setdata(int nvalue) 
     { 
      data=nvalue; 
     } 

     Item<int> operator +(int s) 
     { 
      return Item <int> (data + s); 
     } 

     int getdata() const 
     { 
      return data; 
     } 

     void printdata() 
     { 
      cout<<data<<endl; 
     } 
}; 

Btw Этот класс будет работать только в том случае, если T можно добавить с помощью int.

Item<int> myItem2 = myItem + 3; 

Результат

myItem + 3

будет новый предмет, предположительно, теперь содержит данные значений от myItem плюс 3 (myItem2);

+0

Спасибо за ответ. Вы были правы в отношении ошибки в коде.I попробовали, что вы предложили, и это сработало. Но я вижу, что код также работает, если я пишу оператор + перегрузку как 'int operator + (int s) {return (data + s);}', поэтому код ' Пункт 'перед оператором return необязателен? – Gautam

+0

@gautam do you want 'Item + int' быть' int' или 'Item '? – Yakk

+0

@Yakk Я не понял, что я сделал, написал код вроде этого 'Item myItem2 = myItem + 3', с уже созданным объектом 'myItem' и его членом' data', инициализированным '1', я просто изменил' Item operator + (int s) 'to' int operator + (int s) ', myItem2.данные имели значение 4 по времени «Item myItem2 = myItem + 3' выполнено, поэтому мне было интересно, какую роль« Item »в объявлении функции и возвратном выражении. – Gautam

-1
Item <T> operator +(int s){ 
    return Item <T> (data + s); 
} 

Допустим, у меня есть 2 Элемента объекты:

Item<int> item1; 
item.setdata(4); 
//-- now, call the operator+ member function of item1 
Item<int> item2 = item1 + 10; 

оператора + теперь можно thinked как:

item2 = item1.operator+(10); // operator+ returns an object of Item whose data is 
           // the sum of item1's data member plus the passed argument 
           // which in this case is (10+4) == 14 
Смежные вопросы