Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
#1

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

20.12.2012, 20:42. Просмотров 596. Ответов 15
Метки нет (Все метки)

Почему запятую на класс и инт перегрузить можно, а на два инта нельзя?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2012, 20:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему запятую на класс и инт перегрузить можно, а на два инта нельзя? (C++):

Почему в выражении нельзя использовать запятую вместо && - C++
Привет всем, у меня такой вопрос: Почему в выражении for (i=0; i < *k && strcmp((base+i)->fam,fam); i++); вместо "&&"...

Почему два char нельзя сравнивать так ==? - C++
Почему два char нельзя сравнивать так ==?

Как можно объяснить, почему нельзя использовать полную форму if . else ? - Delphi
Как можно объяснить, почему нельзя использовать полную форму if ... else ? Зада: Подсчитать кол-во положительных чисел среди чисел a.b.c....

Разработать класс относительно которого можно перегрузить операцию "*" - C#
Ребят помогите разработать класс относительно которого можно перегрузить операцию * заранее спс)) using System; using...

Можно как то конвертировать в инт не вызывая Convert.ToInt32 ? - C#
Я наконец то решил почти задачу =) , но вот несостыковка ответ надо в int 32 ,у меня все в int 64 , так как данные заходят именно в нем...

Как можно добавить в класс два списка? - C++
как можно добавить в класс два списка?И как можно установить связь 1:N между двумя списками?

15
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
20.12.2012, 20:51 #2
а можно поинтересоватся зачем?
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.12.2012, 20:55 #3
Насколько я помню, перегрузка оператора запятой может нарушить порядок вычисления аргуметов, поскольку перегрузка будет расцениваться как функция. А в функции порядок вычисления аргументов не определен. Следовательно, перегрузка зяпятой для типа int(да и вообще, для любого типа, если задуматься) может привести к весьма неожиданным последствиям.

Да, и, собственно, перегружать операторы только для встроенных типов вообще нельзя.
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
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;
}
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.12.2012, 21:12 #5
taras atavin, что вы хотели этим сказать?
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
20.12.2012, 21:13  [ТС] #6
Два индекса в квадратных скобках, означающие векторный индекс, а не игнор первого индекса.
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
20.12.2012, 21:15 #7
а может стоит придумать , обращение как в С++ [][] через двойные скобки
0
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.12.2012, 21:26 #8
Цитата Сообщение от taras atavin Посмотреть сообщение
Два индекса в квадратных скобках, означающие векторный индекс, а не игнор первого индекса.
Для этого нужны свойства с параметрами(вроде индексаторов в шарпе). В плюсах такого нету.
Поэтому лучше всего перегружать оператор() или специальный метод.
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.12.2012, 21:32 #9
Цитата Сообщение от taras atavin Посмотреть сообщение
Почему запятую на класс и инт перегрузить можно, а на два инта нельзя?
По той же причине, почему нельзя перегрузить оператор + для них же: ибо нефиг.

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

Удобоваримый сахарок с operator() уже подсказали.
0
soon
2542 / 1307 / 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;
}
1
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
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)
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.12.2012, 13:26 #12
taras atavin, Uniform initialization - фича C++11
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
21.12.2012, 15:32  [ТС] #13
Где можно прочитать подробности?
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.12.2012, 18:38 #14
Можно прочитать FAQ Страуструпа, но я бы советовал вопрос на programmers.stackexchange.com.
1
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
21.12.2012, 18:51  [ТС] #15
Где скачать компилятор x64 для CodeBlocks с поддержкой этого стандарта? Как его подцепить?
0
21.12.2012, 18:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2012, 18:51
Привет! Вот еще темы с ответами:

Почему из интерфейса можно создать анонимный класс? - Java SE
Где почитать или объясните как это возможно. OnClickListener это - public static interface View.OnClickListener ...

Почему нельзя командой copy скопировать системные файлы на дискету? Почему? - CMD/BAT
Пожалуйсат, подскажите, весь интернет перерыла, вот почему нельзя? что нельзя знаю, а по какой причине?

Почему для wildcard можно использовать только один класс/интерфейс - Java SE
почему так недоспустимо писать List&lt;? extends SomeClass &amp; SomeInterface&gt; а так допустимо ? List&lt;T extends SomeClass &amp;...

На рабочем столе нельзя перетаскивать ярлыки, нельзя копировать файлы и нельзя их вставлять - Windows XP
После загрузки компьютера вылезла ошибка, что кокойто файл windows неможет прочесть было предложено открыть программу CHKDSK, после этого ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.