Функция члена-друга может использоваться в отдельных файлах? - PullRequest
0 голосов
/ 30 июня 2018

Я читаю C ++ Primer и застрял на

7.3.4. Возвращение дружбы Создание функции члена в качестве друга

Упражнение 7.32. Определите свои собственные версии Screen и Window_mgr, в которых clear является участником Window_mgr и другом Screen

Я нашел несколько решенных упражнений, но в одном файле:

#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::string;
using std::vector;
using std::ostream;

class Screen;

class Window_mgr{
public:
    using ScreenIndex = vector<Screen>::size_type;
    void clear(ScreenIndex i);
private:
    vector<Screen> screens;
};

class Screen{
    friend void Window_mgr::clear(ScreenIndex);
public:
    typedef string::size_type   pos;
    Screen(pos ht, pos wd, char c) : height(ht), width(wd), contents(ht * wd, c) {}

private:
    pos cursor = 0;
    pos height = 0, width = 0;
    string contents;
};

void Window_mgr::clear(ScreenIndex i){
    Screen &s = screens[i];
    s.contents = string(s.height * s.width, ' ');
}

int main(){
    Window_mgr var;
    return 0;
}

И я пытаюсь решить ее в 5 отдельных файлах, таких как main.cpp, Window_mgr.h, Window_mgr.cpp, Screen.h и Screen.cpp; все еще без удачи. Я исследовал здесь в stackoverflow об этом упражнении, и я нашел много, но что-нибудь о компиляции его в отдельных файлах, так что я думаю ...

Функции-члены друга должны компилироваться в одном файле?

если нет

Как это можно сделать, разделяя каждый класс в своем собственном файле, разделяя реализацию и интерфейс?

  • main.cpp
  • screen.h / Screen.cpp
  • Window_mgr.h / Window_mgr.cpp

и

Необязательно: В каком порядке (как) эти 5 файлов должны быть скомпилированы в makefile

Это может быть возможно? Спасибо!

1 Ответ

0 голосов
/ 30 июня 2018

Я думаю, проблема в циклической ссылке, если вы решите ее с помощью 5 отдельных файлов, Screen.h

#ifndef __SRCEEN__
#define __SRCEEN__
#include <string>
#include "window_mgr.h"
using namespace std;
class Screen{
    friend void Window_mgr::clear(ScreenIndex);// need Window_mgr defination
public:
    typedef string::size_type pos;
    Screen(pos ht, pos wd, char c) : height(ht), width(wd), contents(ht * wd, c) {}

private:
    pos cursor = 0;
    pos height = 0, width = 0;
    string contents;
};
#endif

ваш window_mgr.h

#ifndef __WINDOW_MGR__
#define __WINDOW_MGR__
#include <string>
#include <vector>
#include "Screen.h"
using namespace std;
class Screen;
class Window_mgr{
public:
   using ScreenIndex = vector<Screen>::size_type;// need Screen defination
   void clear(size_t i);
private:
   vector<Screen> screens;// need Screen defination
};
#endif

им нужно получить определение друг друга, вы можете использовать предварительную декларацию, чтобы решить ее в одном файле, но это не очень хорошее решение для этой ситуации: (

...