У меня есть два класса Screen и Window_Mgr (C++ Primer 5th Edition Chapter 7).включают классы в файлы заголовков в других файлах заголовков
- Экран представляет собой класс, который содержит три строки :: size_types и строку в качестве элементов данных.
- Window_Mgr это класс, который содержит объект экранов типа вектора < экрана>.
- инициализирует вектор < экрана> со значениями (24,80,»«) с конструктором в экране.
- void Window_Mgr :: clear (vector :: size_type i) - это функция, которая обращается к закрытым членам строки и очищает их от всех данных.
Я хочу написать этот код таким образом, что только Window_Mgr :: clear является другом экрана.
Проблемы я столкнулся с являются:
- Если я определяю Window_Mgr перед тем экран с неполной декларации я не могу инициализировать экраны.
- Если я определяю экран перед Window_Mgr с неполным объявлением, я не могу объявить Window_Mgr :: clear в качестве друга Экран.
Я попытался включить их с отдельными файлами заголовков, но это был настоящий беспорядок.
#include <iostream>
#include <vector>
class Screen;
struct Window_Mgr{
public:
// using Screen_Index = std::vector<Screen>::size_type;
typedef std::vector<Screen>::size_type Screen_Index;
void clear(Screen_Index i);
Window_Mgr() = default;
private:
std::vector<Screen> Screens;
};
struct Screen{
typedef std::string::size_type pos;
friend void Window_Mgr::clear(Screen_Index i);
Screen() = default;
Screen(pos h, pos w, char s): height(h), width(w), contents(h*w,s){};
char get() const { return contents[cursor];}
char get(pos ht, pos width)const;
Screen &move(pos r, pos c);
Screen &set(char);
Screen &set(pos, pos, char);
Screen & display(std::ostream &);
const Screen & display (std::ostream &) const;
pos size() const;
private:
pos cursor = 0;
pos height = 0, width = 0;
std::string contents;
const Screen do_display (std::ostream& os) const
{
os << contents;
return *this;
}
};
Спасибо за ответ! Я не получаю эти порции: 'Вы нарушаете инкапсуляцию, имея экранный вызов Window_Mgr.' Если вы имеете в виду эту строку' friend void Window_Mgr :: clear (Screen_Index i); 'Я вызываю функцию-член Window_Mgr .. Разве это не разрешено? 'Кроме того, класс Screen не должен знать, находится ли он в контейнере или нет; эта концепция принадлежит классу Window_Mgr' Как класс знает, является ли это контейнером? – Deohboeh
Подумайте, почему 'Screen' нужно вызвать' Window_Mgr'? Это означает, что объект «Screen» знает о своем контейнере. Все, что связано с 'Screen', принадлежит' Screen', а не 'Window_Manager'. –
Идея довольно расплывчата в моей голове, но насколько я понимаю ... 'Window_Mgr :: Screens' - это контейнер' Screen' и в ясном func Я вызываю экран, чтобы очистить элементы 'Window_Mgr :: Screens 'и не вызывать экран, чтобы очистить свои собственные члены через свою собственную функцию, которая делает ее менее модульной? O_O '* Пожалуйста, проявляйте терпение, я могу быть немым, как ... Но я хотел бы это понять ... – Deohboeh