2015-11-19 4 views
1

Я задание, которое требует от меня сделать следующее,C++ Перегрузки и переопределение оператора +

Персонаж суперкласс Digit и объекта является суперкласс символов.

  1. Перегрузите оператор + для класса Character, чтобы он мог добавить два объекта типа Character.

  2. Переопределите оператор + в классе Digit, чтобы он добавил числовое значение двух цифр и доставляет цифру, которую мы получаем, если мы наконец применим «по модулю 10». (например, «5» + «6» = «1» // 5 + 6 = 11% 10 = 1)

Я пытался кодировать их, и имеют различные решения для него. Я сделал комментарии в своем коде и надеюсь, что кто-то может ответить на мои вопросы в комментариях.

class Character : public Object { 
protected: 
    char ch; 

    char getChar() { 
     return this->ch; 
    } 
    char setChar(char in) { 
     this->ch = in; 
    } 

public: 
    //Why must I put Character&? What is the purpose of &? 
    Character operator+(const Character& in) { 
     Character temp; 
     temp.ch = this->ch + in.ch; 
     return temp; 
    } 
}; 

class Digit : public Character { 
public: 
    //Can i use the commented code instead? 
    /* 
    int a, b, c; 
    Digit operator+(Digit& in){ 
     Digit temp; 
     temp.c = (in.a + in.b) % 10; 
     return temp; 
    } 
    */ 
    Digit operator+(const Digit& in) { 
     Digit tmp; 
     //Can some one explain what is this? 
     tmp.ch = (((this->ch - '0') + (in.ch - '0')) % 10) + '0'; 
     return tmp; 
    } 
}; 
+0

У вас должна быть следующая 'const' после') 'каждой из этих сигнатур функций' operator + '. Ответы объяснили, почему второй параметр должен быть 'const &', но первый также должен быть const. Подразумеваемый первый параметр 'Digit *' (становясь 'this') сделан' Digit const * 'тем, что используется' const' – JSF

+0

В задании указано «переопределение». Я не могу читать ум преподавателя, но обычно «переопределение» означает, что функция, которую вы переопределяете, должна быть объявлена ​​«виртуальной», что добавляет некоторые сложности ко всему этому, помимо добавления этого ключевого слова. Так что лучше всего догадаться, инструктор использовал терминологию небрежно, но, возможно, назначение сложнее. – JSF

ответ

0

// Зачем ставить знак &? Какова цель &?

& - reference. operator+ overloading works on two arguments, first one is passed implicitly, while the second one is passed by reference 

// Могу ли я использовать прокомментированный код?

/* 
int a, b, c; 
Digit operator+(Digit& in){ 
    Digit temp; 
    temp.c = (in.a + in.b) % 10; 
    return temp; 
} 
*/ 

Вы не можете использовать этот код. вам нужно пройти мимо «сопзЬ», что гарантия-й непреложность второго аргумента

//Can some one explain what is this? 
    tmp.ch = (((this->ch - '0') + (in.ch - '0')) % 10) + '0'; 

принимает ASCii представление цифры, извлекает это числовое значение, добавляет числовое значение и преобразует обратно в ASCII представление суммы.

0

Зачем ставить знак &? Какова цель &? Это означает, что параметр берется ссылкой/указателем, и объект не копируется.

Могу ли я использовать прокомментированный код? Этот код использует неинициализированные переменные, поэтому он не будет работать.

// Может кто-нибудь объяснить, что это? ч - «0» является хорошо известным хак, чтобы получить значение ASCII представления числа

% 10:

, если результат превышает 10, вычесть 10 (оператор по модулю)

«+ '0':

новообращенный ASCii представление

0
//Why must I put Character&? What is the purpose of &? 

Это приводит к тому, символ, который будет принят в по refere nce, требование перегрузки оператора. Прочитайте прохождение по значению и прохождение по ссылке.


tmp.ch = (((this->ch - '0') + (in.ch - '0')) % 10) + '0'; 

Когда спутать линии попытаться разбить его. Я предполагаю, что вы можете следить за назначением в начале линии, поэтому давайте рассмотрим выражение следующих равенств:

(((this->ch - '0') 

Считайте значение ASCII для символов из этого. Вычтите из этого значение ASCII для '0'. Это работает, потому что ascii имеет восходящие значения. См. http://www.asciitable.com/ и найдите номера в таблице.

Это дает целое число от 0-> 9, соответствующее входящему символу ASCII.

+ (in.ch - '0')) 

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

% 10) 

Добавление двух чисел от 0 до 9 можно легко дать вам номер> 9, которые не могут быть представлены в виде одного ASCII символа. Это оператор остатка и избавляется от всего, кроме первой цифры ответа, т. Е. 0-> 9 - это все, что осталось.

+ '0'; 

Наконец, он добавляет '0' назад к полученному целому числу, чтобы преобразовать его обратно в ASCII.

Смежные вопросы