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

C++ Builder

Войти
Регистрация
Восстановить пароль
 
d7d1cd
201 / 130 / 37
Регистрация: 30.06.2011
Сообщений: 1,217
Завершенные тесты: 1
#1

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

23.06.2017, 09:57. Просмотров 240. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вернуть из функции объект класса-родителя функции (C++ Builder):

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

Переменные из функции класса в функцию другого класса - C++ Builder
Подскажи пожалуйста,как с класса Convector передать в класс Filter одержанный Bitmap и переменные? Convector::Convector() { ...

Как переопределить метод родителя класса? - C++ Builder
Есть класс TDot, который есть классом-наследником для класса TTriangle В классе TDot есть метод setColor(), который меняет цвет и метод...

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

Friend функции, определенные в теле класса - C++
Всем привет! Непонятна логика, которой руководствуются компиляторы. Рассмотрим код: #include <iostream> struct A{...

Прототип функции не виден внутри класса... - C++ Builder
Использую Rad Studio 2010 Для доступа к функции из DLL, описан прототип функции следующим образом: typedef void (_stdcall...

14
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25535 / 17088 / 5416
Регистрация: 22.10.2011
Сообщений: 30,253
Записей в блоге: 6
23.06.2017, 11:03 #2
Правильно-то правильно. Но зачем? Ты ж меняешь оба объекта...
1
d7d1cd
201 / 130 / 37
Регистрация: 30.06.2011
Сообщений: 1,217
Завершенные тесты: 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
201 / 130 / 37
Регистрация: 30.06.2011
Сообщений: 1,217
Завершенные тесты: 1
23.06.2017, 11:51  [ТС] #5
Dinkin, благодарю!
0
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,993
Записей в блоге: 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
645 / 443 / 100
Регистрация: 31.05.2013
Сообщений: 2,263
Записей в блоге: 2
26.06.2017, 18:56 #7
У меня ни разу не было необходимости делать такие обороты в коде(может везло)...а если подумать,то даже не могу нарошно придумать задачу под эту реализацию =))
0
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,993
Записей в блоге: 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
201 / 130 / 37
Регистрация: 30.06.2011
Сообщений: 1,217
Завершенные тесты: 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
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,993
Записей в блоге: 17
26.06.2017, 20:11 #10
Зачем тогда возвращать значение? Это не адекватно как то...
0
d7d1cd
201 / 130 / 37
Регистрация: 30.06.2011
Сообщений: 1,217
Завершенные тесты: 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
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,993
Записей в блоге: 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
201 / 130 / 37
Регистрация: 30.06.2011
Сообщений: 1,217
Завершенные тесты: 1
26.06.2017, 21:16  [ТС] #13
В рабочем коде между if-ами есть безусловный код. Поэтому там нельзя применить else if.
0
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,993
Записей в блоге: 17
26.06.2017, 22:16 #14
Гадалки в отпуске.
0
d7d1cd
201 / 130 / 37
Регистрация: 30.06.2011
Сообщений: 1,217
Завершенные тесты: 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
Привет! Вот еще темы с ответами:

Реализация функции для работы с элементами класса - C++ Builder
Код: Unit001.h: //--------------------------------------------------------------------------- #ifndef Unit001H #define...

Как обратиться к методу класса из внешней функции? - C++
Имеется простой класс Employee с методами GetAge() - возвращает возраст, и SetAge(int age). Как сделать так, чтобы работали функции...

В какой области доступа класса разместить прототип функции? - C++ Builder
Всем привет! Не сталкивался на знаю, разбираю код Дельфи и там встретились прототипы функций. Объясните плиз, в какой части программы по...

Метод класса должен вернуть этот класс - C++ Builder
Вообщем есть класс и его метод. Как изменить этот метод, чтобы при использовании возвращался этот класс с новыми данными Для примера...


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

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

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