Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
d7d1cd
209 / 139 / 50
Регистрация: 30.06.2011
Сообщений: 1,321
Завершенные тесты: 1
1

Вернуть из функции объект класса-родителя функции

23.06.2017, 09:57. Просмотров 265. Ответов 14
Метки нет (Все метки)

Приветствую всех. Вопрос изложу в коде.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class TSomeClass
{
 int data;
 
 public:
 // Правильно ли создана функция?
 TSomeClass Set(int i)
  {
   data = i;
   return *this;
  }
};
 
// Использование
TSomeClass sc;
TSomeClass sc2 = sc.Set(100);

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2017, 09:57
Ответы с готовыми решениями:

Вернуть из функции несколько значений
Приветствую всех. Создается класс для работы с прибором по последовательному...

Переменные из функции класса в функцию другого класса
Подскажи пожалуйста,как с класса Convector передать в класс Filter одержанный...

Как переопределить метод родителя класса?
Есть класс TDot, который есть классом-наследником для класса TTriangle В...

Как в функции реакции объекта получить ссылку на сам объект?
Например есть ф-я void __fastcall TForm1::FormCreate(TObject *Sender) {...

Функции вне класса
При создании функции в .cpp функцию которая не связана с классом можно ли...

14
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26483 / 17786 / 7035
Регистрация: 22.10.2011
Сообщений: 31,301
Записей в блоге: 6
23.06.2017, 11:03 2
Правильно-то правильно. Но зачем? Ты ж меняешь оба объекта...
1
d7d1cd
209 / 139 / 50
Регистрация: 30.06.2011
Сообщений: 1,321
Завершенные тесты: 1
23.06.2017, 11:29  [ТС] 3
Здесь упрощенный пример. В проекте есть места, где необходимо изменить переменные объекта класса и тут же вернуть этот объект как результат функции.
C++
1
2
3
4
5
6
// Вместо
sc.Set(100);
return sc;
 
// Делаю сразу
return sc.Set(100);
0
Dinkin
23.06.2017, 11:32
  #4

Не по теме:


Недавно смотрел вебинар по с++, по теме создания облачных сервисов..вел его мужик типа матерый мужик-разработчик.
Его спрашивают: "а почему раньше компы были слабые, но держали за тыщу подключений онлайн (к примеру мессенджерах), а сейчас компы в 100 раз мощнее, а держут столько же?"....и он ответил:"Да потому что говнокодеров много...ленятся даже свой класс писать. Используют все готовое,а если чего то нет, то сами не пишут".

PS. Я это к тому что ТС не ленится и разбирается =)

0
d7d1cd
209 / 139 / 50
Регистрация: 30.06.2011
Сообщений: 1,321
Завершенные тесты: 1
23.06.2017, 11:51  [ТС] 5
Dinkin, благодарю!
0
Avazart
Эксперт С++
7756 / 5662 / 554
Регистрация: 10.12.2010
Сообщений: 25,663
Записей в блоге: 17
26.06.2017, 18:31 6
Dinkin, Ага только его вопросы вызывают странное удивление...

C++
1
2
// Делаю сразу
return sc.Set(100);
Что мешает сразу делать:
C++
1
return TSomeClass(100);

Или может это имелось ввиду

C++
1
2
3
4
5
6
7
8
9
10
class Value
{
    public:
          Value(int v):v_(0){};
          Value& append(int v)  {  v_+= v; return this;  };
 
          operator int(){  return v_; }
   private:
          int v_;
};
И тогда можно делать так
C++
1
2
  Value v(0);
  int x = v.append(10).append(20).append(30);
1
Dinkin
655 / 452 / 118
Регистрация: 31.05.2013
Сообщений: 2,405
Записей в блоге: 3
26.06.2017, 18:56 7
У меня ни разу не было необходимости делать такие обороты в коде(может везло)...а если подумать,то даже не могу нарошно придумать задачу под эту реализацию =))
0
Avazart
Эксперт С++
7756 / 5662 / 554
Регистрация: 10.12.2010
Сообщений: 25,663
Записей в блоге: 17
26.06.2017, 19:11 8
Dinkin,
C++ (Qt)
1
2
3
4
5
6
QString i;           // current file's number
QString total;       // number of files to process
QString fileName;    // current file's name
 
QString status = QString("Processing file %1 of %2: %3")
                .arg(i).arg(total).arg(fileName);
http://doc.qt.io/qt-5/qstring.html

Ну или мой велосипед, тоже для форматирования строк https://github.com/Avazart/Bicycle/blob/master/Bicycle/Other/Format.h
0
d7d1cd
209 / 139 / 50
Регистрация: 30.06.2011
Сообщений: 1,321
Завершенные тесты: 1
26.06.2017, 19:19  [ТС] 9
Я для упрощенности показал всего одно поле в классе TSomeClass. На самом деле их несколько. В некой функции объект класса TSomeClass является возвращаемым значением. Возвращение объекта TSomeClass из функции может потребоваться в разных местах. Однако перед возвращением в какое-то поле объекта TSomeClass запишется значение. Из-за этого весь сыр-бор.
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
class TSomeClass
{
 int data1;
 int data2;
 ...
 int dataN
 
 public:
 TSomeClass SetData1(int i) { data1 = i; return *this; }
 TSomeClass SetData2(int i) { data2 = i; return *this; }
 ...
 TSomeClass SetDataN(int i) { dataN = i; return *this; }
};
 
TSomeClass SomeFunction()
{
 TSomeClass sc;
 ...
 if(/* установка data1 */) return sc.SetData1(1);
 ...
 if(/* установка data2 */) return sc.SetData1(2);
 ...
  if(/* установка dataN */) return sc.SetData1(0);
}
0
Avazart
Эксперт С++
7756 / 5662 / 554
Регистрация: 10.12.2010
Сообщений: 25,663
Записей в блоге: 17
26.06.2017, 20:11 10
Зачем тогда возвращать значение? Это не адекватно как то...
0
d7d1cd
209 / 139 / 50
Регистрация: 30.06.2011
Сообщений: 1,321
Завершенные тесты: 1
26.06.2017, 21:11  [ТС] 11
Цитата Сообщение от Avazart Посмотреть сообщение
Зачем тогда возвращать значение?
Функция SomeFunction должна вернуть объект TSomeClass. Если бы методы SetData не возвращали значений, то каждое условие в примере выше надо было бы делать так:
C++
1
2
3
4
5
if(/* установка data1 */)
 {
  sc.SetData1(1);
  return sc;
 }
0
Avazart
Эксперт С++
7756 / 5662 / 554
Регистрация: 10.12.2010
Сообщений: 25,663
Записей в блоге: 17
26.06.2017, 21:12 12
Для этого можно использовать конструктор.

Во вторых достаточно

C++
1
2
3
4
5
if(/* установка data1 */)  sc.SetData1(1);
else  if(/* установка data2 */) sc.SetData1(2);
else  if(/* установка dataN */) sc.SetData1(0);
 
return rc;
0
d7d1cd
209 / 139 / 50
Регистрация: 30.06.2011
Сообщений: 1,321
Завершенные тесты: 1
26.06.2017, 21:16  [ТС] 13
В рабочем коде между if-ами есть безусловный код. Поэтому там нельзя применить else if.
0
Avazart
Эксперт С++
7756 / 5662 / 554
Регистрация: 10.12.2010
Сообщений: 25,663
Записей в блоге: 17
26.06.2017, 22:16 14
Гадалки в отпуске.
0
d7d1cd
209 / 139 / 50
Регистрация: 30.06.2011
Сообщений: 1,321
Завершенные тесты: 1
28.06.2017, 20:36  [ТС] 15
Цитата Сообщение от Avazart Посмотреть сообщение
Во вторых достаточно
C++
1
2
3
4
5
6
7
8
9
if(/* установка data1 */)  sc.SetData1(1);
// тут другие операторы, например int a = 1;
 
else  if(/* установка data2 */) sc.SetData1(2); // тут получим ошибку компилятора
// тут другие операторы, например int b = 1;
 
else  if(/* установка dataN */) sc.SetData1(0); // тут получим ошибку компилятора
 
return rc;
0
28.06.2017, 20:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2017, 20:36

Прототип функции не виден внутри класса...
Использую Rad Studio 2010 Для доступа к функции из DLL, описан прототип...

Friend функции, определенные в теле класса
Всем привет! Непонятна логика, которой руководствуются компиляторы. ...

Реализация функции для работы с элементами класса
Код: Unit001.h:...


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

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

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