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

есть вложенный класс который является другом объемлюющего и всё это должно компилиться. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ E-mail чекер http://www.cyberforum.ru/cpp-beginners/thread327302.html
Доброго времени суток. Решил написать емайл чекер, который проверял бы и уведомлял пользователя об новых письмах. Например на mail.ru или yahoo.com. Пытался найти какие-нибудь исходники, но...
C++ [DEV C++]`string' undeclared (first use this function) Пробую объявить строку а он пишет 17 C:\Users\Íàäæäà\Desktop\Òåëåôîííûå_Íîìåðà.cpp `string' undeclared (first use this function) Все способы уже которые смог придумать перебрал и 0 реакции.... http://www.cyberforum.ru/cpp-beginners/thread327291.html
C++ не работает программа
помогите пожалуйста написал программу которая считывает слова из текстового файла, сортирует их по алфавиту и записывает их в другой файл, при компиляции ошибок нету, а вот сама программа не работает...
C++ Программирование с использование функции
Для трех данных уравнений,, вывести количество действительных корней. Использовать функцию, которая по известным коэффициентам квадратного уравнения находит количество его действительных корней...
C++ переделать структуры в классы http://www.cyberforum.ru/cpp-beginners/thread327261.html
Найти корни квадратного трехчлена с заданными комплексными коэффициентами. Для моделирования комплексных чисел объявите класс. #include <iostream.h> #include <conio.h> #include <stdio.h>...
C++ Большое количество вызовов констр-ра и дестр-ра Добрый день! Есть класс для подсчёта указателей на объект и класс, который сопровождает или поддерживает работу предыдущего, храня на него указатель. RefPointer.h #pragma once #include... подробнее

Показать сообщение отдельно
fasked
Эксперт С++
4945 / 2525 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
01.07.2011, 14:31
Цитата Сообщение от kravam Посмотреть сообщение
Так ведь? Или всё ж таки вложенность даёт нечто, чего не добиться с помощью других способов взаимодействия классов, например, дружественности? Вроде не даёт.
Вложенность позволяет ограничить "область действия" класса. Например, если написать так, то класс internal не будет доступен никому.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class external {
private:
    class internal {
    };
 
private:
    internal in;
};
 
int main() {
    external a;
    //external::internal b; // error: ‘class external::internal’ is private
 
    return 0;
}
Если написать это как public, то класс external будет действовать как пространство имен.
Выгоды есть. Как уже говорилось выше классы создаются для удобства.
Конкретный пример с матрицей, когда нужен вложенный класс, если матрица реализуется на основе Си-подобных массивов. Интуитивно понятным является обращение к элементу матрицы через оператор [], то есть matrix[i][j]. В Си++ существует возможность перегрузить operator[]. Однако обращение как к двумерному массиву к классу запрещено. Поэтому создается вложенный класс "строка", для него также перегружается operator[]. Перегруженный operator[] в классе "матрица" возвращает ссылку на класс "строка". Таким образом фактически производится вызов row = matrix.operator[](i), element = row.operator[j]. Как я уже отметил, matrix.operator[](i) возвращает ссылку на класс "строка" и только тогда уже возможен вызов row.operator[j].

Ну как-то так, в общем смысл всегда есть

Ну и очень грубый пример:
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
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
 
class external {
private:
    class internal {
        public:
            int operator[](int j) {
                return a[j];
            }
 
            int a[2];
    };
 
public:
    external() {
        in[0].a[0] = 0;
        in[0].a[1] = 1;
        in[1].a[0] = 2;
        in[1].a[1] = 3;
    }
 
    internal& operator[](int i) {
        return in[i];
    }
 
private:
    internal in[2];
};
 
int main() {
    external a;
    // external::internal b; error: ‘class external::internal’ is private
    std::cout << a[0][0] << a[0][1] << a[1][0] << a[1][1] << std::endl;
 
    return 0;
}
При этом класс 'internal' по-прежнему не доступен вне класса 'external'.

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