Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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++;类在作为与结构相同类型的参数传递时进行交互?_C++_C_Inheritance - Fatal编程技术网

C++ 如何将C结构包装在C++;类在作为与结构相同类型的参数传递时进行交互?

C++ 如何将C结构包装在C++;类在作为与结构相同类型的参数传递时进行交互?,c++,c,inheritance,C++,C,Inheritance,假设我使用NCurses中的windowstruct获得下面的代码 #include "ncurses.h" class Window : public WINDOW { Window(int winHeight, int winWidth, int startX, int startY) { newwin(winHeight, winWidth, startX, startY); } void refresh() {

假设我使用NCurses中的windowstruct获得下面的代码

#include "ncurses.h"

class Window : public WINDOW {
    Window(int winHeight, int winWidth, int startX, int startY) {
        newwin(winHeight, winWidth, startX, startY);
    }
    void refresh() {
        wrefresh(this);
    }
};

int main() {
    initscr();

    Window win = Window(5, 5, 5, 5);
    win.refresh();

    endwin();
    return 0;
}

是否有一个适当的方式让C++类继承C结构,以便它们可以作为它们传递,类似于继承的C++类如何可以?

< p>一个创建C库中定义的结构的C++“包装器”的方法,这样您就可以轻松地通过<强>指针“< /强>”到这样一个库中的API调用,以模拟MFC(微软基金会类)库将GDI对象(如<代码> ReCT结构)封装成类,如“代码> CCRTT < /COD> < < /P>”。 MFC使用对“基”结构的直接继承,并在每个类中提供返回指向基结构的指针(实际上是类实例的
this
指针)的运算符

在下面的代码中,我展示了
RECT
结构的定义以及
CRect
类的一些摘录,这些摘录来自相关的Windows标题和MFC标题/源

//来自“windef.h”的“C”基结构
类型定义结构tagRECT
{
左长;
长顶;
长右;
长底;
}RECT,*LPRECT;
typedef const RECT*lprect;
类错误:public tagRECT
{
公众:
正确(整数l,整数t,整数r,整数b){
//将给定参数指定给基础结构成员。。。
左侧=l;顶部=t;右侧=r;底部=b;
}
//...
//实用程序例程。。。
int Width()常量{
返回右-左;
}
//...
//在正确和LPRECT/LPRECT之间转换(不需要&)
运算符LPRECT(){
归还这个;
}
运算符LPCRECT()常量{
归还这个;
}
//...
};
使用这样定义的包装类,您可以将
CRect
对象(如上面的注释所示,不需要
&
)传递给C库中的调用,该调用需要指向
RECT
的指针。例如,接受一个
LPRECT
参数,并从C调用,如下所示:

HWND-HWND;
RECT-RECT;
BOOL answer=GetWindowRect(hWnd,&rect);//将指针传递到C结构
使用
CRect
类,您只需传递对象,而
LPRECT
操作符将处理其余部分(但如果确实需要,您可以添加
&
):

HWND-HWND;
正确的rc;
BOOL answer=GetWindowRect(hWnd,rc);

这种方法有一些限制和注意事项(例如,如果C库希望通过值传递
RECT
,可能会发生可怕的事情),但您可能会发现这种方法很有用。

不清楚。用C++编译,只存在代码> C++ >代码>代码>结构> /CONTROS>,可以从中继承。在考虑可能的答案之前,也许先发布你遇到的问题,而不是你想要的不正确的解决方案:这样做违背了良好设计的基本原则。不要继承窗口,而是使其成为数据成员。您的窗口类不是ncurses句柄。ncurses似乎不想让您触摸
Window
s。特别是,
newwin
自行分配
窗口,因此尝试用
WINDOW
来“替换”它们没有多大意义,因为您无法控制对象的创建。如果你想为ncurses函数提供一个“更多的C++”接口,你想包装指针,而不是从结构继承。简单继承是MFC(C++)类,如
CRect
接受旧的WinAPI(C)结构,如
RECT
class-CRect:public-tagRECT{…<代码> >但是这些类还提供了一个返回继承结构的指针,如运算符LPRECTHE(;)/<代码> .@ Simulas,这是一个观点。MFC背后的驱动力是为现有的C风格WiNAPI提供C++包装。健壮。回答很好,但正确性并不完全来自MFC。该类在
中定义。如果我正确理解NCurses文档,它将窗口作为指针,我怎么能让它认识到这一点?@soons好吧,我很老了,在过去,只有MFC。ATL后来出现了(IIRC)@WilliamB您可以让您的类继承自
窗口
,然后添加一个
操作符窗口*()
成员,该成员返回
,使用的是
LPRECT
类型,它在第一个代码块中定义为
RECT*
。而且,如果所有库调用都使用窗口指针,那么使用这种方法应该是相当安全的。@AdrianMole不确定我是否年轻得多。这种转换发生在Visual Studio 2002中。下面是脱机MSDN库的说明他们:“从Visual C++ .NET 2002开始,已经修改或修改了几个现有的MFC实用程序类,以减少它们对其他MFC类的依赖性。这些实用工具类现在可以用于任何本地C++项目。”