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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Trurlol
0 / 0 / 0
Регистрация: 24.12.2012
Сообщений: 21
#1

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

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

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

Классы "Небесное тело" и "Планета" - C++
Создать класс CelestialBody(небесное тело) , который содержит следующие элементы: -поле"масса" float Mass; -поле "радиус" float ...

"Классы и объекты" -"операторы" - C++
Объект «множество целых чисел удвоенной длины заданной мощности». Предусмотреть возможность операции присваивания, объединения двух...

Написать программу "Отдел кадров", используя классы - C++
Написать программу "Отдел кадров", используя классы. В public указать имя, год рождения и оклад сотрудника, в private город, адрес, пол....

Виртуальные классы и ошибка "Error LNK2001: unresolved external symbol" - C++
Решил перелезть с C# на C++. Ну или по крайней мере немного его подучить для самообразования. В C# есть такая замечательная вещь как...

Базовый класс "Летательный аппарат" и производные классы Ракета и Самолет - C++
Определить абстрактный базовый класс "Летательный аппарат" содержащий данные, описывающие название, стартовую массу аппарата. В этом...

Классы.Ключевое слово static - выдает ошибку "неразрешенный внешний символ" - C++
Всем доброго времени суток. Изучаю С++ по Шпаку и по урокам на сайте cppstudio.com, предварительно хорошо ознакомившись с ассемблером... ...

Классы для работы с данными "Библиотека" - C++
Нужно сделать задачу по классам, HELP! :cry: Создайте программу с классом Bibliographer, который включает в себя следующие...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 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
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2013, 04:06     "вложенные классы" #4
Цитата Сообщение от Trurlol Посмотреть сообщение
Как такая конструкция называется и как она делается?
На это ответ уже дан. Вопрос в том, подходит ли это для ваших целей?
Цитата Сообщение от Trurlol Посмотреть сообщение
double G = c.Astro().G();
Тут объект с вызывает метод Astro(), который возвращает объект, который, в свою очередь, вызывает метод G(), который возвращает переменную double, присваиваемую переменной G.
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
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2013, 09:23     "вложенные классы"
Еще ссылки по теме:

Наследование. Классы "Точка - Круг - Эллипс" - C++
Если коротко объяснять суть проблемы: Класс tEllipse наследует от tCircle метод LineMove (который tCircle унаследовал от tPoint и...

Задача по теме "Кондитерские изделия", классы - C++
Я просто долгое время болел и пропустил тему связанную с классами, а завтра уже надо сдать готовую программу, ребят, помогите...

Напишите задания на тему "Классы" - C++
Напишите пожалуйста задания по классам!!!

Классы: перегрузка операции "Бинарный +" - C++
Помогите пожалуйста реализовать перегрузку операции бинарный+:добавляет к значению поля amount значения скаляра #include &lt;iostream&gt; ...

"Закрытые" классы и auto - C++
#include &lt;typeinfo&gt; #include &lt;iostream&gt; class A { class B {}; public: static B foo() { return...


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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 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     "вложенные классы"
Ответ Создать тему
Опции темы

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