Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
eightdex
0 / 0 / 0
Регистрация: 03.07.2017
Сообщений: 5
1

Подскажите, как называется этот прием?

03.07.2017, 23:18. Просмотров 329. Ответов 9

Всем привет

Допустим, имеется какой-либо класс, имеющий поля данных и два метода:

class someClass
{
private:
int a, b;
public:
void func1();
void func2()
{};
};

В основной программе создается объект класса, а затем вызывается метод объекта func1:

int main()
{
someClass someObject;
someObject.func1();
}

В теле метода объекта func1() имеется необходимость вызвать метод объекта func2() - я делал это следующим образом и все работало:

void someClass::func1()
{
someClass::func2();
}

Подскажите, пожалуйста, как называется такой прием в C++ someClass::func2(); и как он работает? Я так понимаю, он позволяет получить доступ к методу применительно к вызывающему объекту, тем самым организуется вложенный метод? В книге, по которой изучаю язык такого ещё не было, сам случайно до этого додумался
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2017, 23:18
Ответы с готовыми решениями:

Подскажите плжалуйста как называется эта програма ???
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <locale.h> #include...

Как называется такой прием ??
По запросу: автосервис ваз москва на втором месте страница:...

Как называется этот контрол?
Сабж собственно: И как сделать чтобы были названия над столбцами?

Как называется этот шаблон?
Здравствуйте! Подскажите пожалуйста как называется шаблон на этом сайте? http://dnop.gov.ua/

Как называется этот держатель?
Ребят кто в курсе как называется этот держатель для айфона или смартфона, перегуглил всю сеть не...

9
ASDFD12
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 544
03.07.2017, 23:23 2
Это называется вызов функции.
1
eightdex
0 / 0 / 0
Регистрация: 03.07.2017
Сообщений: 5
03.07.2017, 23:26  [ТС] 3
А каким образом организуется связь с объектом класса??
0
ASDFD12
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 544
03.07.2017, 23:30 4
Через ссылку на экземпляр класса, через которую происходит вызов функции-члена.
1
dawn artist
Заблокирован
03.07.2017, 23:34 5
Цитата Сообщение от eightdex Посмотреть сообщение
А каким образом организуется связь с объектом класса??
http://en.cppreference.com/w/cpp/language/this
When a non-static class member is used in any of the contexts where the this keyword is allowed (non-static member function bodies, member initializer lists, default member initializers), the implicit this-> is automatically added before the name, resulting in a member access expression (which, if the member is a virtual member function, results in a virtual function call).
0
eightdex
0 / 0 / 0
Регистрация: 03.07.2017
Сообщений: 5
03.07.2017, 23:40  [ТС] 6
Цитата Сообщение от daun-autist Посмотреть сообщение
Пока ещё не проходил указатели, видимо это что-то очень похожее) Спасибо!

Добавлено через 1 минуту
Цитата Сообщение от ASDFD12 Посмотреть сообщение
Через ссылку на экземпляр класса, через которую происходит вызов функции-члена.
Спасибо, буду разбираться дальше
0
Ordinary Mind
2 / 2 / 0
Регистрация: 17.12.2016
Сообщений: 20
03.07.2017, 23:50 7
Вам не обязательно писать в теле метода, который хочет вызвать метод своего же класса идентификатор класса.
Иными словами вот это:
C++
1
2
3
4
void someClass::func1()
{
someClass::func2(); 
}
нужно писать вот так:
C++
1
2
3
4
void someClass::func1()
{
func2(); 
}
Так можно делать потому что метод Func1() и метод Func2() являются методами одного и того же класса.
И как уже сказали выше это называется вызов метода/функции


На счет организации связи объекта с классом.
Смотрите:

Перед вами заголовочный файл (.h) класса Moto:

C++
1
2
3
4
5
6
7
8
9
10
11
class Moto{
  public:
    void ShowInfo();
 
  private:
    void ShowSpeed();
    void ShowPrice();
    int max_speed_ = 270;
    double price_ = 7500.00;
 
}
А вот его файл реализации (.cpp):

C++
1
2
3
4
5
6
7
8
9
10
11
12
void Moto::ShowInfo(){
  ShowSpeed();
  ShowPrice();
}
 
void Moto::ShowSpeed(){
  std::cout << "Max speed: " << speed_ << "\n"
}
 
void Moto::ShowPrice{
  std::cout << "Price: " << price_ << "\n";
}
теперь вгляните на main.cpp

C++
1
2
3
4
int main(){
   Moto moto;
   moto.ShowInfo();
}
Класс Moto - это определенный пользователем тип данных, а moto - это экземпляр этого класса. С этим экземпляром можно делать все, что вы определили в классе Moto.
Это тоже самое как:
C++
1
int moto = 0;
Тип int - это встроенный тип данных, жестко зашитый, стандартный, а moto в данном случае - просто экземпляр встроенного типа int.
С экземпляром этого встроенного типа данных можно сделать все что определено для него, например сложение, вычитание, деление, умножение.

Надеюсь помог Вам хоть немного )
1
eightdex
0 / 0 / 0
Регистрация: 03.07.2017
Сообщений: 5
04.07.2017, 00:23  [ТС] 8
[QUOTE=Ordinary Mind;10597846]

Вы мне невероятно помогли, Большущее Вам спасибо !! Все очень подробно и доходчиво
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4848 / 2492 / 696
Регистрация: 18.10.2014
Сообщений: 4,326
04.07.2017, 02:31 9
Цитата Сообщение от eightdex Посмотреть сообщение
Подскажите, пожалуйста, как называется такой прием в C++ someClass::func2(); и как он работает?
Вопрос в том, о каком именно "приеме" вы тут говорите.

Как вам уже сказали, для того, чтобы из метода someClass::func1() вызвать местод someClass::func2() совсем не обязательно повторять имя класса в вызове. Имя класса там ни к чему и выглядит странновато. Обычно этот вызов делают так

C++
1
2
3
4
void someClass::func1()
{
  func2(); 
}
или, если кому нравится, так

C++
1
2
3
4
void someClass::func1()
{
  this->func2(); 
}
но не так как у вас.

Ваш же вариант используется лишь в специфических случаях для достижения специфической цели: если данный объект типа someClass является базовым подобъектом какого-то объекта-наследника, метод func2() является виртуальным и перегруженным в классе-наследнике, то два моих вышеприведенных варианта вызовут именно перегруженный метод из класса-наследника, т.е. произойдет виртуальный вызов. А ваш вариант вызовет именно метод someClass::func2(). Т.е. ваш синтаксис - это "прием", который используется для подавления виртуальности при вызове виртуальной функции.

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
#include <iostream>
 
struct someClass
{
  virtual void func2()
    { std::cout << "someClass::func2" << std::endl; }
    
  void func1()
  {
    func2();            // виртуальный вызов
    someClass::func2(); // невиртуальный вызов
  }
};
 
struct someDerivedClass : someClass
{
  virtual void func2()
    { std::cout << "someDerivedClass::func2" << std::endl; }
};
 
int main(int argc, char *argv[])
{
  someDerivedClass d;
  d.func1();
}
Код
someDerivedClass::func2
someClass::func2
Но я что-то сомневаюсь, что вас в контексте данного вопроса интересует подавление виртуальности. Поэтому синтаксис someClass::func2() вам тут ни к чему.
2
eightdex
0 / 0 / 0
Регистрация: 03.07.2017
Сообщений: 5
04.07.2017, 07:50  [ТС] 10
Действительно, о виртуальности функций дело ещё не доходило спасибо огромное за подробный ответ!
0
04.07.2017, 07:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2017, 07:50

Как называется этот плагин?
Доброго времени суток, подскажите пожалуйста как называться этот плагин? или как реализовать такую...

Как называется этот слайдер
Как называется вот такой слайдер бегущей строки, как на этом сайте...

Как называется этот декомпилятор C#?
Как прога називаетца забыл вот скрин http://rghost.ru/11864561.view


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

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

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