Я новичок в C++, но у меня есть опыт программирования на языках высокого уровня (Java и т. Д.). Основная проблема, с которой я сейчас сталкиваюсь, заключается в понимании наследования и интерфейсов в C++.Выполнение интерфейса Inherit
testsurface.h
#include <QSurface>
class TestSurface : public virtual QSurface
{
public:
TestSurface(SurfaceClass clazz) : QSurface(clazz) { }
~TestSurface() { }
virtual QSurfaceFormat format() = 0;
virtual QSize size() = 0;
virtual QPlatformSurface* surfaceHandle() = 0;
virtual SurfaceType surfaceType() = 0;
};
testwindow.h
#include <QWindow>
#include "testsurface.h"
class TestWindow : public QWindow, public TestSurface
{
public:
TestWindow() : QWindow(), TestSurface(QWindow::Window) { }
~TestWindow() { }
};
В моем понимании, TestSurface
проходит все абстрактные методы от QSurface
вдоль. Из-за TestWindow
наследуется QWindow
который наследующий QSurface
я бы ожидать, что все необходимые методы TestSurface::QSurface
реализуются через TestWindow::QWindow
, но это не так, потому что я получаю следующее сообщение об ошибке: При строительстве
C2512: C:\...\Qt\Projects\Test2\testwindow.h:10: Erroe: C2512: 'QSurface::QSurface': no appropriate default constructor available
и
C:\...\Qt\Projects\Test2\main.cpp:12: Error: C2259: 'TestWindow': Instance of abstract class can't be created because of following members:
"QSurfaceFormat TestSurface::format(void)": is abstract
c:\...\qt\projects\test2\testsurface.h(12): See declaration of 'TestSurface::format'
"QSize TestSurface::size(void)": is abstract
c:\...\qt\projects\test2\testsurface.h(13): See declaration of 'TestSurface::size'
"QPlatformSurface *TestSurface::surfaceHandle(void)": is abstract
c:\...\qt\projects\test2\testsurface.h(14): See declaration of 'TestSurface::surfaceHandle'
"QSurface::SurfaceType TestSurface::surfaceType(void)": is abstract
c:\...\qt\projects\test2\testsurface.h(15): See declaration of 'TestSurface::surfaceType'
"QSurfaceFormat QSurface::format(void) const": is abstract
D:\...\msvc2013_64_opengl\include\QtGui/qsurface.h(67): See declaration of 'QSurface::format'
"QPlatformSurface *QSurface::surfaceHandle(void) const": is abstract
D:\...\msvc2013_64_opengl\include\QtGui/qsurface.h(68): See declaration of 'QSurface::surfaceHandle'
"QSurface::SurfaceType QSurface::surfaceType(void) const": is abstract
D:\...\msvc2013_64_opengl\include\QtGui/qsurface.h(70): See declaration of 'QSurface::surfaceType'
"QSize QSurface::size(void) const": is abstract
D:\...\msvc2013_64_opengl\include\QtGui/qsurface.h(73): See declaration of 'QSurface::size'
Хм, хорошо, я это вижу. Но если я хочу сохранить свою настройку, тогда мне придется обернуть реализацию QWindow :: QSurface. Как 'QSize TestWindow :: size() {return QWindow :: size(); } ', но вот проблема:' QWindow :: surfaceHandle() 'является приватным в' QWindow'. Похоже, я не могу делать то, что хотел. –
@BastiFunck - вы можете получить дескриптор 'QPlatformWindow' через' QWindow :: handle() ',' QPlatformWindow' наследует 'QPlatformSurface', который имеет public' QSurface * surface() const', если получить поверхность - это то, что вам нужно , – dtech
Теперь, когда я знаю, что мне нужно идти с завершением реализации, это было бы следующим шагом, чтобы узнать, как получить дескриптор QWindow. Спасибо, что сэкономил мне время на поиск в Google –