Реализация перегрузки операторов с помощью логарифмов в C ++ - PullRequest
2 голосов
/ 05 мая 2010

У меня возникли проблемы с реализацией класса логарифма с перегрузкой операторов в C ++.

Моя первая цель - как реализовать метод changeBase, мне было тяжело, оборачиваясь вокруг него.

Я пытался понять математику, лежащую в основе изменения логарифма, но я не смог. Может кто-нибудь объяснить, пожалуйста, мне?

Моя вторая цель - выполнить операцию, в которой левый операнд представляет собой double, а правый операнд представляет собой объект логарифма.

Вот фрагмент моего журнала:

// coefficient: double
// base: unsigned int
// result: double
class _log {

 double coefficient, result;
 unsigned int base;

public:

 _log() {
  base = 10;
  coefficient = 0.0;
  result = 0.0;
 }
 _log operator+ ( const double b ) const;
 _log operator* ( const double b ) const;
 _log operator- ( const double b ) const;
 _log operator/ ( const double b ) const;
 _log operator<< ( const _log &b );

 double getValue() const;

 bool changeBase( unsigned int base );
};

Вы, ребята, потрясающие, спасибо за ваше время.

Ответы [ 3 ]

5 голосов
/ 05 мая 2010

Моя вторая цель - уметь выполнять операцию, в которой левый операнд является двойным, а правый операнд - объектом логарифма.

Для этого вам нужно объявить оператор как функцию, не являющуюся членом в области имен (т.е. не в определении _log), например,

_log operator+(const double a, const _log& b);

Если вам нужен доступ к закрытым членам _log, вы можете объявить его своим другом в определении _log:

friend _log operator+(const double a, const _log& b);

Обратите внимание, что имена, начинающиеся с подчеркивания (например, _log), зарезервированы для реализации в глобальном пространстве имен; если за подчеркиванием следует заглавная буква или другое подчеркивание, оно сохраняется везде. Было бы неплохо выбрать другое имя класса.

3 голосов
/ 05 мая 2010

Несколько вещей

  1. Использование _ в начале вашего класса - очень плохая идея (тм). Из стандарта С ++:

17.4.3.2.1 Глобальные имена [lib.global.names] Определенные наборы имен и сигнатур функций всегда зарезервированы для реализация:

  • Каждое имя, которое содержит двойное подчеркивание (_ _) или начинается с знак подчеркивания, за которым следует заглавная буква письмо (2.11) зарезервировано для реализация для любого использования.
  • Каждое имя, начинающееся с подчеркивания, зарезервировано для реализация для использования в качестве имени в глобальное пространство имен. 165

165) Такие имена также зарезервированы в пространстве имен :: std (17.4.3.1).

  1. Я предполагаю, что вы использовали _log вместо log из-за конфликта с log () в cmath. Это очень плохая идея, чтобы держать свои собственные классы в стандартном пространстве имен именно по этой причине. Может быть, следующая версия стандарта предоставит класс _log или Logarithm? Оберните свой собственный класс в namespace somename {} и укажите его, используя somename::Logarithm()

  2. Как уже упоминали другие Вам нужно объявить перегрузку вашего оператора как друга. Вместо того, что у вас есть

    log operator+ ( const double b ) const;

    изменить на

    friend log operator+(const double d, const log& l);
    

    и определите функцию в области имен.

  3. Вот математика для изменения базовой формулы

    Change of base formula

  4. Коэффициент в математике означает часть, которая умножается на журнал. Так что, если у вас было A log_b (x) = y

    A - коэффициент, B - основание, а Y - результат (или некоторые другие имена)

1 голос
/ 05 мая 2010

Несколько идей:

  1. Не называйте с подчеркиванием. Такие идентификаторы радиоактивны в C и C ++.
  2. Определить операции между логарифмами до операций с числами с плавающей запятой.
  3. Объединить № 2 с предложением Джеймса:

    friend logarithm operator+( const logarithm &l, const logarithm &r );
    
  4. Определить конструктор преобразования для генерации logarithm из числа с плавающей запятой:

    logarithm::logarithm( double f );
    

    Теперь C ++ преобразует double в logarithm в 1.0 + my_log или my_log + 1.0.

  5. Реализация натуральных логарифмов в вашем классе. Не беспокойтесь о base.
  6. Определение базового преобразования в терминах функции:

    double alternate_base( double base ) const;
    

    Преобразование базы просто делит logarithm на натуральный логарифм альтернативной базы. Вероятно, наиболее удобно возвращать целую и дробную части вместе в одном double.

...