2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 C++, перегрузить операцию скобочки ()
Сообщение09.10.2009, 12:38 
Аватара пользователя


23/01/08
565
По идее, перегрузить можно все кроме "." и " : ? ". Интересно было бы узнать, как перегрузить скобочки. Если кто знает - пожалуйста, поделитесь.

 Профиль  
                  
 
 Re: C++, перегрузить операцию скобочки ()
Сообщение09.10.2009, 13:04 
Заслуженный участник


28/04/09
1933
Пример дурацкий, но вполне рабочий:
Код:
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 
Заслуженный участник


26/07/09
1559
Алматы
2Spook
C.f. функторы, там как раз перегрузка оператора вызова функции применяется. Можно почитать исходники STL.

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

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

 Профиль  
                  
 
 Re: C++, перегрузить операцию скобочки ()
Сообщение09.10.2009, 22:03 


31/08/09
183
Ребята, а как перегрузить cout << комплексное число.
т.е. << надо перегрузить?
я попробовал не получилось

 Профиль  
                  
 
 Re: C++, перегрузить операцию скобочки ()
Сообщение09.10.2009, 22:48 
Заслуженный участник


26/07/09
1559
Алматы
Можно отталкиваться от этого:
Код:
#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 
Заслуженный участник


04/05/09
4587
Вроде, у стандартного complex<> уже есть такой оператор.
Если же у вас нестандартный, то:
Код:
ostream& operator<<(ostream& out, const Complex& c)
{
    out << '(' << c.Real() << ',' << c.Imag() << ')';
    return out;
}

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


23/01/08
565
EtCetera, спасибо!

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

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

 Профиль  
                  
 
 Re: C++, перегрузить операцию скобочки ()
Сообщение10.10.2009, 17:54 
Заслуженный участник


26/07/09
1559
Алматы
Я не знаю оператора .->. :)

Операторы ::, . и .* нельзя перегружать потому, что они оперируют не значениями, а именами. Технически это реализовать конечно можно, но при этом могут возникнуть некоторые проблемы [Страуструп, 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 


30/09/09
9
Цитата:
Я не знаю оператора .->.

Этот оператор слудит для работы с ссылками.
к примеру:
Код:
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 
Заслуженный участник


26/07/09
1559
Алматы
2Gendolf
Цитата:
Этот оператор слудит для работы с ссылками.

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

 Профиль  
                  
 
 Re: C++, перегрузить операцию скобочки ()
Сообщение17.10.2009, 20:16 


30/09/09
9
Уже увидел))) Ничо, с каждым бывает))

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group