Объединение перегруженных операторов с "новым" объектом

я хотел бы спросить что-то довольно трудное для меня; Я должен создать программу типа календаря, но с перегруженным оператором "+ =".

Так оно и происходит:

template<typename T1,typename T2,typename T3> //int,int,int
class T_sort_data{

T1 p1;
T2 p2;
T3 p3;

public:

    T_sort_data(){
        cout << "\n\t Constructed at [" << this << "]\n";};

/   friend ostream& operator<<(ostream& os,const T_sort_data& obj) // get function
{
    os << "\nDay : " << obj.p1 << " \n";
    os << "Month : " << obj.p2 << " \n";
    os << "Year : " << obj.p3 << " \n";
    return os;
}*/

void set_date(){
    int dd,mm,yy;
    cout << "\n\n\tPlease input the day, the month and the year : \n\n";
    cin >> dd >> mm >> yy;
    p1 = dd;
    p2 = mm;
    p3 = yy;
}

// validator here, which works ...  

T_sort_data<int,int,int>& operator+=(const T_sort_data<int,int,int>& second)
{
    p1+=second.p1;
    return *this;
}

friend istream& operator>>(istream& is, T_sort_data& obj) // set function
{
    is >> obj.p1;
    is >> obj.p2;
    is >> obj.p3;
    return is;
}

~T_sort_data(){
    cout << "\n\t Deconstructed [" << this << "]\n";};

  };

  int main(){
T_sort_data<int,int,int> * a = new T_sort_data<int,int,int> ;
bool more = true;
    string answ;

a->set_date();
//cin >> a; (this doesn't work)
    //validator goes here

//a += a; (this, again, doesn't work)

delete a;

return 0;
  }

Всякий раз, когда я создаю объект, используя "T_sort_data a;" эти операции работают нормально, но всякий раз, когда я использую "T_sort_data * a = new T_sort_data;" дерьмо попадает в вентилятор.

Кто-нибудь может мне с этим помочь?

-4
задан 08 июня '13 в 19:26
источник поделиться
2 ответов

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

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

cin >> *a;

или

*a += *a;
2
ответ дан 08 июня '13 в 19:32
источник

T_sort_data a - это переменная типа T_sort_data.

T_sort_data * a - это переменная типа указателя на T_sort_data.

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

Это довольно фундаментально. Здесь то же самое с int и std::cout: http://codepad.org/N07Xckdy

1
ответ дан 08 июня '13 в 19:35
источник

Другие вопросы по меткам или Задайте вопрос