Форум программистов, компьютерный форум CyberForum.ru

Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? - C++

Восстановить пароль Регистрация
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 20:42     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? #1
Почему запятую на класс и инт перегрузить можно, а на два инта нельзя?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2012, 20:42     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя?
Посмотрите здесь:

Можно ли перегрузить " ' кавычки? C++
C++ Класс matrix. Не получается перегрузить оператор =
Как можно добавить в класс два списка? C++
Создать класс вектор Vector (int *). Перегрузить операции: C++
Описать класс my_str и перегрузить для него операторы. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
20.12.2012, 20:51     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? #2
а можно поинтересоватся зачем?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.12.2012, 20:55     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? #3
Насколько я помню, перегрузка оператора запятой может нарушить порядок вычисления аргуметов, поскольку перегрузка будет расцениваться как функция. А в функции порядок вычисления аргументов не определен. Следовательно, перегрузка зяпятой для типа int(да и вообще, для любого типа, если задуматься) может привести к весьма неожиданным последствиям.

Да, и, собственно, перегружать операторы только для встроенных типов вообще нельзя.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 21:04  [ТС]     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
class TIndexVector2D
{
 public:
  int x, y;
};
TIndexVector2D operator (int x, int y)
{
 TIndexVector2D Result;
 Result.x=x;
 Result.y=y;
 return Result;
}
class TMatrix
{
 protected:
  double *Data;
  size_t Rows, Collumns;
 public:
  TMatrix();
  ~TMatrix();
 double operator [] (TIndexVector2D Index);
 bool resize (TIndexVector2D Index);
};
TMatrix::TMatrix()
{
 Data=NULL;
 Rows=0;
 Collumns=0;
}
TMatrix::~TMatrix()
{
 double *p;
 if (Data) 
 {
  delete [] Data;
 }
 Data=NULL;
 Rows=0;
 Collumns=0;
}
double TMatrix::operator [] (TIndexVector2D Index)
{
 return *(Data+Index.x+Index.y*Rows);
}
bool TMatrix::resize (TIndexVector2D Index)
{
 if ((Index.x>0)&&(Index.y>0))
 {
  Data=new [Index.x*Index.y];
  if (Data)
  {
   Rows=x;
   Collumns=y;
   return true;
  }
  Data=NULL;
  Rows=0;
  Collumns=0;
 }
 return false;
}
int main()
{
 TMatrix m;
 m.resize(10,20);
 m[4,6]=8.9;
 ...
 return 0;
}
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.12.2012, 21:12     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? #5
taras atavin, что вы хотели этим сказать?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 21:13  [ТС]     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? #6
Два индекса в квадратных скобках, означающие векторный индекс, а не игнор первого индекса.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
20.12.2012, 21:15     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? #7
а может стоит придумать , обращение как в С++ [][] через двойные скобки
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.12.2012, 21:26     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? #8
Цитата Сообщение от taras atavin Посмотреть сообщение
Два индекса в квадратных скобках, означающие векторный индекс, а не игнор первого индекса.
Для этого нужны свойства с параметрами(вроде индексаторов в шарпе). В плюсах такого нету.
Поэтому лучше всего перегружать оператор() или специальный метод.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.12.2012, 21:32     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? #9
Цитата Сообщение от taras atavin Посмотреть сообщение
Почему запятую на класс и инт перегрузить можно, а на два инта нельзя?
По той же причине, почему нельзя перегрузить оператор + для них же: ибо нефиг.

Хотите рефлексивный язык с поддержкой ООП, где можно перегружать и переопределять всё что угодно — у вас есть Smalltalk.

Удобоваримый сахарок с operator() уже подсказали.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.12.2012, 21:41     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? #10
Еще как вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 
class Foo
{
public:
    Foo(int a, int b): _a(a), _b(b)
    {
 
    }
 
    friend std::ostream& operator<< (std::ostream& stream, const Foo& f)
    {
        return (stream << f._a << ' ' << f._b);
    }
 
private:
    int _a, _b;
};
 
struct Bar
{
    void operator[] (Foo f)
    {
        std::cout << f << std::endl;
    }
};
 
int main()
{
    Bar b;
    b[{1, 2}];
    return 0;
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.12.2012, 09:07  [ТС]     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? #11
Цитата Сообщение от Nixy Посмотреть сообщение
, обращение как в С++ [][] через двойные скобки
Это есть и на паскале, но там к любому многомерному массиву можно обращаться так и так.

Добавлено через 3 минуты
Цитата Сообщение от soon Посмотреть сообщение
Еще как вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 
class Foo
{
public:
    Foo(int a, int b): _a(a), _b(b)
    {
 
    }
 
    friend std::ostream& operator<< (std::ostream& stream, const Foo& f)
    {
        return (stream << f._a << ' ' << f._b);
    }
 
private:
    int _a, _b;
};
 
struct Bar
{
    void operator[] (Foo f)
    {
        std::cout << f << std::endl;
    }
};
 
int main()
{
    Bar b;
    b[{1, 2}];
    return 0;
}
Кодоблоки на это пишут:
||=== Test, Debug ===|
C:\tsserver\Projects\cpp\codeblocks\test\test.cpp||In function 'int main()':|
C:\tsserver\Projects\cpp\codeblocks\test\test.cpp|31|error: expected primary-expression before '{' token|
C:\tsserver\Projects\cpp\codeblocks\test\test.cpp|31|error: expected ']' before '{' token|
C:\tsserver\Projects\cpp\codeblocks\test\test.cpp|31|error: expected ';' before '{' token|
C:\tsserver\Projects\cpp\codeblocks\test\test.cpp|31|error: expected primary-expression before ']' token|
C:\tsserver\Projects\cpp\codeblocks\test\test.cpp|31|error: expected ';' before ']' token|
||=== Build finished: 5 errors, 0 warnings ===|
Добавлено через 11 минут
А таскать за каждым обращением явный вызов конструктора векторного индекса не охота, уж лучше тогда
C++
1
2
3
4
5
6
7
8
9
10
class TVector
{
 public:
  int x;
  int y;
};
TVector v;
for (v.x=0; v.x<n; ++v.x)
{
 for (v.y=0; v.y<m; ++v.y)
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.12.2012, 13:26     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? #12
taras atavin, Uniform initialization - фича C++11
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.12.2012, 15:32  [ТС]     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? #13
Где можно прочитать подробности?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.12.2012, 18:38     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? #14
Можно прочитать FAQ Страуструпа, но я бы советовал вопрос на programmers.stackexchange.com.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.12.2012, 18:51  [ТС]     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? #15
Где скачать компилятор x64 для CodeBlocks с поддержкой этого стандарта? Как его подцепить?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2012, 19:12     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя?
Еще ссылки по теме:

C++ Создать класс комплексных чисел, перегрузить операторы -= и *=
Почему в выражении нельзя использовать запятую вместо && C++
C++ Почему два char нельзя сравнивать так ==?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.12.2012, 19:12     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? #16
taras atavin, под винду? Не силен в этом. Недавно качал инсталлер(по-моему, этот), вроде работал.
Yandex
Объявления
21.12.2012, 19:12     Почему запятую на класс и инт перегрузить можно, а на два инта нельзя?
Ответ Создать тему
Опции темы

Текущее время: 08:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru