Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 简化将成员传递到包含类的方法(在C+;+;)_C++_Oop_Inheritance - Fatal编程技术网

C++ 简化将成员传递到包含类的方法(在C+;+;)

C++ 简化将成员传递到包含类的方法(在C+;+;),c++,oop,inheritance,C++,Oop,Inheritance,我环顾四周,但找不到我要找的内容(不确定使用什么关键字)。我自己在做C++项目。该项目有窗口s、页面s和字段s。窗口可以包含一个或多个页面s,而页面可以包含一个或多个字段s。在窗口、页面和字段中共享的是,它们有一个输入管理器,负责用户的所有IO。InputManager可以作用于窗口、页面和字段(例如,有些输入直接作用于页面,而有些则作用于字段)。另外,字段可以生成状态消息,显示在包含窗口的位置 现在我有以下结构,但它似乎不是最优的。有很多指针向下传递,我想知道是否有更好的方法 class In

我环顾四周,但找不到我要找的内容(不确定使用什么关键字)。我自己在做C++项目。该项目有
窗口
s、
页面
s和
字段
s。
窗口
可以包含一个或多个
页面
s,而
页面
可以包含一个或多个
字段
s。在
窗口
页面
字段
中共享的是,它们有一个
输入管理器
,负责用户的所有IO。
InputManager
可以作用于窗口、页面和字段(例如,有些输入直接作用于
页面
,而有些则作用于
字段
)。另外,
字段
可以生成
状态
消息,显示在包含
窗口的位置

现在我有以下结构,但它似乎不是最优的。有很多指针向下传递,我想知道是否有更好的方法

class InputManager
{
    //do stuff to return input
}

class StatusManager
{
    //do stuff to display statuses
}

class Field
{
    friend class Page;
protected:
    InputManager *input_manager;
    StatusManager *status_manager;

    /*
    other methods that do stuff that 
    may recieve from input_manager and 
    send statuses through the status_manager
    */
}

class Page
{
    friend class Window;
protected:
    vector<Field* > fields;
    InputManager *input_manager;
    StatusManager *status_manager;
public:
    AddField(Field *field)
    {
        field->input_manager = this->input_manager;
        field->status_manager = this->status_manager;
    }
}

class Window
{
protected:
    vector<Page *> pages;
    InputManager *input_manager;
    StatusManager *status_manager;
public:
    Window()
    {
        input_manager = new InputManager();
        status_manager = new StatusManager();
    }

    AddPage(Page *page)
    {
        page->input_manager = this->input_manager;
        page->status_manager = this->status_manager;
    }
}
类输入管理器
{
//做一些事情来返回输入
}
类状态管理器
{
//做一些事情来显示状态
}
类字段
{
好友类页面;
受保护的:
输入管理器*输入管理器;
StatusManager*状态管理器;
/*
其他的方法可以做到这一点
可从输入管理器和
通过状态管理器发送状态
*/
}
类页
{
好友类窗口;
受保护的:
向量场;
输入管理器*输入管理器;
StatusManager*状态管理器;
公众:
添加字段(字段*字段)
{
字段->输入管理器=此->输入管理器;
字段->状态管理器=此->状态管理器;
}
}
类窗口
{
受保护的:
矢量页面;
输入管理器*输入管理器;
StatusManager*状态管理器;
公众:
窗口()
{
输入管理器=新的输入管理器();
状态管理器=新状态管理器();
}
添加页面(第*页)
{
页面->输入管理器=此->输入管理器;
页面->状态管理器=此->状态管理器;
}
}

如果我想更多地了解这些类型的问题,我应该研究哪些关键字或字段?

尝试使用
unique\u ptr
而不是
new
另一种方法是将输入和状态对象传递给需要它们的方法,但很难说在你的情况下,这是否总体上更好。目前我仅限于C++0x,但我将在将来记住这一点developments@VaughnCato你能再解释一下吗?你是说依赖注入吗?我的意思是拥有
Field::method(InputManager&,StatusManager&)
,当调用
Field::method
时,要求
字段
用户传递
InputManager
StatusManager
参数,而不是将它们存储在字段中。尝试使用
unique\u ptr
而不是
new
另一种方法是将输入和状态对象传递给需要的方法他们,但很难说在你的情况下,这是否总体上更好。目前我仅限于C++0x,但我将在将来记住这一点developments@VaughnCato你能再解释一下吗?你是说依赖注入吗?我的意思是拥有
Field::method(InputManager&,StatusManager&)
,并要求
Field
用户在调用
Field::method
时传递
InputManager
StatusManager
参数,而不是将它们存储在字段中。