Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Trurlol
0 / 0 / 0
Регистрация: 24.12.2012
Сообщений: 21
#1

"вложенные классы"

04.08.2013, 23:03. Просмотров 631. Ответов 6
Метки нет (Все метки)

Не знаю как правильно это называет, так что извиняйте. К примеру есть такая конструкция
C++
1
float Time = Clock.GetElapsedTime().asSeconds();
Где Clock - объект. Вместо .asSeconds() можно поставить .asMilliseconds(). Как такая конструкция называется и как она делается? Допустим я хочу сделать себе библиотеку физических констант, т.е. должно быть что-то вроде такого
C++
1
double G = c.Astro().G();
c - объект, Astro() - "директория" в которой лежат астрономические константы и G непосредственно сама константа. Пробовал через вложенные классы - ничего не вышло или допустил ошибку или делается совершенно по другому, не знаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2013, 23:03
Ответы с готовыми решениями:

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование)
Разработать программу с использованием наследования классов, реализующую...

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления"
Помогите с кодом написания задачи, не понимаю как написать классы в классе. ...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс"
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран...

Базовый класс "Изделие" и производные классы "Мышь", "Клавиатура", "Монитор"
/*Создать класс изделие, с полями себестоимость, цена, время выполнения,...

Создать классы "Computer", "Software", "User" и реализовать взаимодействие объектов этих типов между собой
Помогите решить задачку,нужна в инст на экзамен. Составить программу...

6
iRomul
159 / 100 / 14
Регистрация: 17.10.2012
Сообщений: 483
Завершенные тесты: 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();
Ну примерно так, класс вы уже сами реализовываете
0
Trurlol
0 / 0 / 0
Регистрация: 24.12.2012
Сообщений: 21
05.08.2013, 00:57  [ТС] #3
Что-то не очень понятно. В гугле ничего не могу найти по запросу "цепочки вызовов".
0
alsav22
5439 / 4834 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2013, 04:06 #4
Цитата Сообщение от Trurlol Посмотреть сообщение
Как такая конструкция называется и как она делается?
На это ответ уже дан. Вопрос в том, подходит ли это для ваших целей?
Цитата Сообщение от Trurlol Посмотреть сообщение
double G = c.Astro().G();
Тут объект с вызывает метод Astro(), который возвращает объект, который, в свою очередь, вызывает метод G(), который возвращает переменную double, присваиваемую переменной G.
0
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;
}
Я сам не гуру С++, но уверен что вообще идеально твою задачу можно выполнить с помощью наследования классов. Народ ещё подключится и покажет как это сделать, за одно и сам посмотрю.
0
Croessmah
++Ͻ
14376 / 8158 / 1534
Регистрация: 27.09.2012
Сообщений: 20,104
Записей в блоге: 3
Завершенные тесты: 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
0
alsav22
5439 / 4834 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2013, 09:23 #7
Цитата Сообщение от Trurlol Посмотреть сообщение
Допустим я хочу сделать себе библиотеку физических констант, т.е. должно быть что-то вроде такого:
C++
1
double G = c.Astro().G();
Ошибка в подходе: не нужно класс (классы) подгонять под некий метод. Сначала нужно определиться с данными в классе. Если хотите библиотеку, то что она будет из себя представлять? Если в ней будут храниться объекты других классов, то что они из себя представляют? А потом уж методы.
0
05.08.2013, 09:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2013, 09:23

Класс "Графический объект", от которого будут наследоваться классы "круг" и "квадрат"
Реализовать класс Графический объект от которого будут наследоваться классы...

Базовый класс "Источник напряжения", производные классы "Цепь" и "Аккумулятор"
Дали задачу по программированию: составить класс &quot;Источник напряжения&quot;, для...

Базовый класс "многоугольник" и производные классы "треугольник" и "прямоугольник"
Не могу понять как реализовать данное задание. Создать 1 базовый класс и...


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

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

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