Я работаю над попыткой создать игровой движок с нуля (используя только системы, предоставляемые OS) и пытаюсь создать его на c ++. В качестве теста я хотел создать оболочку c ++ для окна какао. (Добавьте графику позже) Я обнаружил, что мне нужно использовать идиоту pimpl. У меня есть файл App. cpp (основной метод для тестирования), файл Device.h и файл Device. cpp. Этот код компилируется с использованием clang ++ без каких-либо проблем, так почему он не отображает окно на экран.
Приложение. cpp
#include "Device.h"
int main() {
Outlaw::MacDevice* device = new Outlaw::MacDevice();
}
Device.h
namespace Outlaw {
//C++ NSView Wrapper Class
struct MacViewImpl;
struct MacViewRect;
class MacView {
public:
MacViewImpl* impl;
MacViewRect* frame;
MacView();
~MacView();
};
//C++ NSWindow Wrapper Class;
struct MacWindowImpl;
class MacWindow {
public:
MacWindowImpl* impl;
MacWindow(MacView* view);
~MacWindow();
};
struct MacDeviceImpl;
class MacDevice {
public:
MacDeviceImpl* impl;
MacWindow* window;
MacView* view;
MacDevice();
~MacDevice();
void Run();
};
}
Device.mm
#include <Cocoa/Cocoa.h>
#include "Device.h"
@interface MacViewItfc : NSView
-(void)drawRect:(NSRect)rect;
@end
@implementation MacViewItfc
-(void) drawRect:(NSRect)rect {
[[NSColor grayColor] set];
NSRectFill([self bounds]);
}
@end
@interface MacWindowItfc : NSWindow <NSApplicationDelegate>
@end
@implementation MacWindowItfc
@end
namespace Outlaw {
//C++ Wrapper for ViewItfc (NSView)
struct MacViewImpl {
MacViewItfc* pimpl;
};
struct MacViewRect {
NSRect pimpl = NSMakeRect(100.0,100.0,300.0,300.0);
};
MacView::MacView() :
impl(new MacViewImpl), frame(new MacViewRect) {
impl->pimpl = [[MacViewItfc alloc] initWithFrame:frame->pimpl];
}
MacView::~MacView() {
if (impl)
[impl->pimpl release];
}
//C++ Wrapper for WindowItfc (NSWindow)
struct MacWindowImpl {
MacWindowItfc* pimpl;
};
MacWindow::MacWindow(MacView* view) :
impl(new MacWindowImpl) {
impl->pimpl = [[MacWindowItfc alloc] initWithContentRect:view->frame->pimpl
styleMask:NSWindowStyleMaskTitled
|NSWindowStyleMaskClosable
|NSWindowStyleMaskResizable
backing:NSBackingStoreBuffered
defer:NO];
[impl->pimpl setTitle:@"Outlaw Game"];
[impl->pimpl setContentView:view->impl->pimpl];
[impl->pimpl makeKeyAndOrderFront:nil];
}
MacWindow::~MacWindow() {
if (impl)
[impl->pimpl release];
}
//C++ Wrapper for NSApplication
struct MacDeviceImpl {
NSApplication* pimpl;
};
MacDevice::MacDevice()
: impl(new MacDeviceImpl) {
impl->pimpl = [NSApplication sharedApplication];
view = new MacView();
window = new MacWindow(view);
[impl->pimpl setDelegate:window->impl->pimpl];
}
MacDevice::~MacDevice() {
if (impl)
[impl->pimpl release];
}
void MacDevice::Run() {
[impl->pimpl run];
}
}
Так почему созданный исполняемый файл не создает окно и что я могу сделать, чтобы его исправить?