Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2010, 23:05   #1
icyFairy
 
Регистрация: 03.03.2010
Сообщений: 3
По умолчанию классы, операторы. Проблема this, op= [c++]

Добрый день.

1) В классе существует оператор (), в том же классе я хочу использовать этот оператор для облегчения жизни:

Код:
class cls
{
public:
int a, b;
...

int operator()(int in_a, int in_b)
{...};

cls foo(cls in)
{
...
cls res(c,d);
res(i,j) = this(i,k)*in(j,k);
...
};

...
};
Компилер мне выдал `this' cannot be used as a function.

Хорошо, нельзя - значит нельзя (точно нельзя?).

2) Идем другим путем.
Код:
class cls
{
public:
int a, b;
...

int operator()(int in_a, int in_b)
{...};

cls operator=(cls in)
{
a = in.a;
b = in.b;
return this;
};

cls foo(cls in)
{
...
cls res(c,d), tmp(a,b);
tmp = this;
res(i,j) = tmp(i,k)*in(j,k);
...
};

...
};
Здесь обнаруживаем сразу две проблемы:
- conversion from `cls* const' to non-scalar type `cls' requested
- no match for 'operator=' in 'tmp = this'

Честно говоря, первой не очень поняла. Немного поискав, я нашла, что действительно используется return *this, но я же оперирую не адресами, но самими объектами, зачем мне возвращать указатель?

Хорошо, допустим пусть будет
Код:
cls& operator=(cls in)
{
...
return *this;
};
Но пролема несоответствия оператора остается.
Причем компилятор мне намекает, что надо бы использовать указатели:
note: candidates are: cls& cls::operator=(cls)
Нельзя ли обойтись без них?

В качестве бонуса компилер выдал
Код:
non-lvalue in assignment: res(i,j) = tmp(i,k)*in(j,k);
Вот здесь моя голова окончательно перестала соображать.

По оператору () у нас возвращается значение внутреннего публичного массива. То есть я не могу так же задать значение тому же элементу массива? Теоретически я догадываюсь, что надо бы задавать по указателю на этот элемент, но что-то не приходит в голову, как.
icyFairy вне форума Ответить с цитированием
Старый 04.03.2010, 00:14   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от icyFairy Посмотреть сообщение
Добрый день.

1) В классе существует оператор (), в том же классе я хочу использовать этот оператор для облегчения жизни:

Код:
class cls
{
public:
int a, b;
...

int operator()(int in_a, int in_b)
{...};

cls foo(cls in)
{
...
cls res(c,d);
res(i,j) = this(i,k)*in(j,k);
...
};

...
};
Компилер мне выдал `this' cannot be used as a function.

Хорошо, нельзя - значит нельзя (точно нельзя?).
Можно.
Код:
res(i, j) = (*this)(i, k) * in(j, k);
this - указатель, а указатель это отдельный тип. А операторы перегружены для класса, потому и работать нужно с объектом класса, а не с указателем на объект )

Единственная проблема в этом случае, так это тип возвращаемого значения оператора()
Код:
int operator()(int in_a, int in_b)
...
Раз он возвращает элемент массива, и вы хотите присваивать этому элементу новое значение, то, вероятно, стоит возвращать ссылку
Код:
int& operator()(int in_a, int in_b)
{
     ....
}

Последний раз редактировалось netrino; 04.03.2010 в 22:38.
netrino вне форума Ответить с цитированием
Старый 04.03.2010, 01:26   #3
icyFairy
 
Регистрация: 03.03.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
this - указатель, а указатель это отдельный тип.
Я этот момент как-то упустила, да. Это многое объясняет.
С возвращением ссылки тоже все просто, как обычно.
Задав tmp указателем, компилер перестал ругаться и, кажется, заработало как надо. Спасибо большое.

Тогда заодно еще один вопрос:
При попытке сделать наследный класс, компилер в конструкторе наследного класса ругается на несовпадение функций для вызова конструктора базового класса. Я, честно говоря, думала, что конструктор наследного класса замещает конструктор базового, поэтому не очень понимаю, что именно требуется. Различается в конструкторах только количество параметров.

Код:
class cls
{
int a,b;
cls(int a, int b);
};

class cls_:cls
{
int a;
cls_(int a);
};
Типа того. С классами не работала совсем, да.
icyFairy вне форума Ответить с цитированием
Старый 04.03.2010, 14:42   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Нет, конструкторы не могут замещаться, также как и деструкторы. При создании объекта производного класса последовательно вызываются конструкторы всех его базовых классов и затем конструктор производного. Проблема в том, что нельзя предугадать с какими конкретно параметрами вызывать конструкторы базовых классов, потому по умолчанию компилятор пытается вызвать конструктор без параметров, если такого не существует, то необходимо указывать явно какой конструктор и с какими параметрами вызывать:
Код:
class cls
{
public:
    int a, b;
    cls(int a, int b) { ... }
};

class cls_ : cls 
{
public:
    int c;
    cls_(int a_) : cls(10, 20) { c = a_; }
};
netrino вне форума Ответить с цитированием
Старый 09.03.2010, 20:37   #5
icyFairy
 
Регистрация: 03.03.2010
Сообщений: 3
По умолчанию

Извиняюсь за лишнее поднятие темы, но долго не было интеренета, не могла ответить сразу.
Большое спасибо за объеснение, разобралась. Видимо, я таки невниметельно читала теорию.
icyFairy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С# классы проблема с созданием обьекта bondik Общие вопросы .NET 3 25.11.2009 10:02
Операторы цикла Paul Oakenfold Помощь студентам 10 23.03.2009 16:08
Операторы прерывания Иринкаа Общие вопросы Delphi 13 27.11.2007 21:52