Форум программистов, компьютерный форум CyberForum.ru

"вложенные классы" - C++

Восстановить пароль Регистрация
 
Trurlol
0 / 0 / 0
Регистрация: 24.12.2012
Сообщений: 21
04.08.2013, 23:03     "вложенные классы" #1
Не знаю как правильно это называет, так что извиняйте. К примеру есть такая конструкция
C++
1
float Time = Clock.GetElapsedTime().asSeconds();
Где Clock - объект. Вместо .asSeconds() можно поставить .asMilliseconds(). Как такая конструкция называется и как она делается? Допустим я хочу сделать себе библиотеку физических констант, т.е. должно быть что-то вроде такого
C++
1
double G = c.Astro().G();
c - объект, Astro() - "директория" в которой лежат астрономические константы и G непосредственно сама константа. Пробовал через вложенные классы - ничего не вышло или допустил ошибку или делается совершенно по другому, не знаю.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
04.08.2013, 23:45     "вложенные классы" #2
Ну вообще нзывается это цепочками вызовов. Для этого необходимо, что бы метод возвращал объект класса (или ссылку на него), из которого мы вызываем следующий метод.
C++
1
2
3
4
//Допустим у нас есть класс Converter. В нём есть функция Astro(), вот её прототип:
Converter& Converter::Astro();
//И метод G():
Converter& Converter::G();
Соответственно когда происходит вызов Astro(), мы можем вызвать метод от объекта, который этим методом.
C++
1
2
Converter a(5);
auto num = a.Astro().G();
Ну примерно так, класс вы уже сами реализовываете
Trurlol
0 / 0 / 0
Регистрация: 24.12.2012
Сообщений: 21
05.08.2013, 00:57  [ТС]     "вложенные классы" #3
Что-то не очень понятно. В гугле ничего не могу найти по запросу "цепочки вызовов".
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2013, 04:06     "вложенные классы" #4
Цитата Сообщение от Trurlol Посмотреть сообщение
Как такая конструкция называется и как она делается?
На это ответ уже дан. Вопрос в том, подходит ли это для ваших целей?
Цитата Сообщение от Trurlol Посмотреть сообщение
double G = c.Astro().G();
Тут объект с вызывает метод Astro(), который возвращает объект, который, в свою очередь, вызывает метод G(), который возвращает переменную double, присваиваемую переменной G.
BezDesu
 Аватар для BezDesu
0 / 0 / 0
Регистрация: 26.07.2013
Сообщений: 47
05.08.2013, 08:11     "вложенные классы" #5
Цитата Сообщение от Trurlol Посмотреть сообщение
c - объект, Astro() - "директория" в которой лежат астрономические константы и G непосредственно сама константа. Пробовал через вложенные классы - ничего не вышло или допустил ошибку или делается совершенно по другому, не знаю.
Вложенные классы используются редко - для специфичных задач. А то что ты хочешь можно реализовать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class AstroConstants {
public:
    double G() { return 74.8; }
    double F() { return 104.62; }
};
 
class Constants {
public:
    AstroConstants Astro() { AstroConstants astroCon; return astroCon; }
};
 
int main()
{   
    Constants c;
 
    double G = c.Astro().G(); // Обращение к константе такое, как ты и хотел.
    cout << G << endl;
    double F = c.Astro().F();
    cout << F << endl;
 
    return 0;
}
Но реализация тогда не изящна, из-за строки:
C++
1
AstroConstants Astro() { AstroConstants astroCon; return astroCon; }
По этому делаем так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class AstroConstants {
public:
    double G() { return 74.8; }
    double F() { return 104.62; }
};
 
class Constants {
public:
    AstroConstants astroCon; // Объект другого класса, содержащий константы.
};
 
int main()
{   
    Constants c;
 
    double G = c.astroCon.G(); // Обращение к константе теперь более адекватное.
    cout << G << endl;
    double F = c.astroCon.F();
    cout << F << endl;
 
    return 0;
}
Я сам не гуру С++, но уверен что вообще идеально твою задачу можно выполнить с помощью наследования классов. Народ ещё подключится и покажет как это сделать, за одно и сам посмотрю.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11818 / 6797 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
05.08.2013, 08:30     "вложенные классы" #6
Цитата Сообщение от Trurlol Посмотреть сообщение
Пробовал через вложенные классы - ничего не вышло
Чем не устроили пространства имен?
C++
1
2
3
4
5
6
7
8
9
10
11
12
namespace Constants {
    namespace Astro {
        double const G = 74.8 ;
        double const F = 104.62 ;
    }
    namespace Math {
        double const PI = 3.14 ;
    }
}
 
//...
Constants::Astro::G
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2013, 09:23     "вложенные классы"
Еще ссылки по теме:

C++ Классы "Небесное тело" и "Планета"
C++ Классы "Бинарное дерево" и "Узел" в одном приложении
C++ Описание классов. Классы "Шар" и "Ящик для шаров"

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2013, 09:23     "вложенные классы" #7
Цитата Сообщение от Trurlol Посмотреть сообщение
Допустим я хочу сделать себе библиотеку физических констант, т.е. должно быть что-то вроде такого:
C++
1
double G = c.Astro().G();
Ошибка в подходе: не нужно класс (классы) подгонять под некий метод. Сначала нужно определиться с данными в классе. Если хотите библиотеку, то что она будет из себя представлять? Если в ней будут храниться объекты других классов, то что они из себя представляют? А потом уж методы.
Yandex
Объявления
05.08.2013, 09:23     "вложенные классы"
Ответ Создать тему
Опции темы

Текущее время: 12:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru