2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 C++, перегрузить операцию скобочки ()
Сообщение09.10.2009, 12:38 
Аватара пользователя
По идее, перегрузить можно все кроме "." и " : ? ". Интересно было бы узнать, как перегрузить скобочки. Если кто знает - пожалуйста, поделитесь.

 
 
 
 Re: C++, перегрузить операцию скобочки ()
Сообщение09.10.2009, 13:04 
Пример дурацкий, но вполне рабочий:
Код:
class Sqrt
{
public:
  int operator()
    (
      int x
    )
  {
    return x * x;
  }
};

//...

int main()
{
  Sqrt sqrt;
  int y, x = 2;

  y = sqrt(x); //y = 4
  return 0;
}


-- Пт окт 09, 2009 14:07:55 --

Ошибся, ошибся! Не Sqrt, а, конечно, Sqr.

 
 
 
 Re: C++, перегрузить операцию скобочки ()
Сообщение09.10.2009, 20:10 
2Spook
C.f. функторы, там как раз перегрузка оператора вызова функции применяется. Можно почитать исходники STL.

Цитата:
По идее, перегрузить можно все кроме "." и " : ? ".

Операторы :: и .* тоже нельзя перегружать.

 
 
 
 Re: C++, перегрузить операцию скобочки ()
Сообщение09.10.2009, 22:03 
Ребята, а как перегрузить cout << комплексное число.
т.е. << надо перегрузить?
я попробовал не получилось

 
 
 
 Re: C++, перегрузить операцию скобочки ()
Сообщение09.10.2009, 22:48 
Можно отталкиваться от этого:
Код:
#include <iostream>

typedef struct {float Real, Imaginary;} mycomplex;

ostream &operator <<(ostream &Stream, mycomplex &Number)
{
    Stream << Number.Real << "," << Number.Imaginary;
    return Stream;
}

 
 
 
 Re: C++, перегрузить операцию скобочки ()
Сообщение09.10.2009, 22:49 
Вроде, у стандартного complex<> уже есть такой оператор.
Если же у вас нестандартный, то:
Код:
ostream& operator<<(ostream& out, const Complex& c)
{
    out << '(' << c.Real() << ',' << c.Imag() << ')';
    return out;
}

 
 
 
 Re: C++, перегрузить операцию скобочки ()
Сообщение10.10.2009, 16:54 
Аватара пользователя
EtCetera, спасибо!

Circiter писал(а):
Операторы :: и .* тоже нельзя перегружать.

Интересно, а почему .-> можно, а .* нельзя?

 
 
 
 Re: C++, перегрузить операцию скобочки ()
Сообщение10.10.2009, 17:54 
Я не знаю оператора .->. :)

Операторы ::, . и .* нельзя перегружать потому, что они оперируют не значениями, а именами. Технически это реализовать конечно можно, но при этом могут возникнуть некоторые проблемы [Страуструп, 94].

-- Вс окт 11, 2009 00:11:23 --

2venco
Согласитесь, ведь вообще поля Re, Img должны быть private, а перегруженный оператор тогда должен быть friend.

Т.е. лучше писать примерно так:

Код:
#include <iostream>

struct Complex
{
    friend std::ostream &operator <<
        (
            std::ostream &Stream,
            const Complex &Number
        )
    {
        Stream <<
            '(' << Number.Real << ", "
            << Number.Imaginary << ')';
        return Stream;
    }

    explicit Complex(const double Real=0, const double Imaginary=0)
        :Real(Real), Imaginary(Imaginary) {}

    Complex(const Complex &Number)
        :Real(Number.Real), Imaginary(Number.Imaginary) {}

        ...

    private:
        double Real, Imaginary;
};


Хотя можно просто определить соответствующие public-accessor'ы (лучше inline) Re() и Img().


2mycoding
Цитата:
Ребята, а как перегрузить cout << комплексное число.

Ещё можно так:

Код:
#include <string>
#include <sstream>
#include <iostream>

struct Complex
{
    operator std::string()
    {
        std::ostringstream String;
        String <<
            '(' << Real << ", "
            << Imaginary << ')';
        return String.str();
    }

        ...

    private:
        double Real, Imaginary;
};

    ...

int main(void)
{
    Complex Number;

    std::cout << (std::string)Number;

    return 0;
}


Но лучше так не делать. :)

-- Вс окт 11, 2009 01:19:18 --

2Spook
Под [Страуструп, 94] я подразумевал написанную в 94-ом книжонку B. Stroustrup, The Design and Evolution of C++.

 
 
 
 Re: C++, перегрузить операцию скобочки ()
Сообщение17.10.2009, 00:40 
Цитата:
Я не знаю оператора .->.

Этот оператор слудит для работы с ссылками.
к примеру:
Код:
void CMyProjektView::OnDraw(CDC* pDC)
{
   
   pDC->TextOutW(1,1,dlg.txt,dlg.txt.GetLength());

   
}

т.е. здесь для pDC вызывается функция TextOutW.

Код:
#include <iostream>

typedef struct {float Real, Imaginary;} mycomplex;

ostream &operator <<(ostream &Stream, mycomplex &Number)
{
    Stream << Number.Real << "," << Number.Imaginary;
    return Stream;
}

Должен заметить, что для классов данная функция объявляется дружественной, а сама функция выносится за пределы класса.
а скобочки можно перегрузить так (например, для произвольного класса CNumber):
Код:
cass CNumber
{
       .............
       CNumber operator ()(const &CNumber z)const
       {
                return z;
        }
        ..............
       
};

 
 
 
 Re: C++, перегрузить операцию скобочки ()
Сообщение17.10.2009, 01:49 
2Gendolf
Цитата:
Этот оператор слудит для работы с ссылками.

Прочитайте мое сообщение ещё раз, внимательно, каждый символ. :)

 
 
 
 Re: C++, перегрузить операцию скобочки ()
Сообщение17.10.2009, 20:16 
Уже увидел))) Ничо, с каждым бывает))

 
 
 [ Сообщений: 11 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group