Code:QxtPimplExample.cpp

From qtnode

Jump to: navigation, search
#include <QxtPimpl.h>
#include <iostream>

class MyTestPrivate;
class MyTest {
public:
    MyTest();

    void doSomething();

    int x;

private:
    QXT_DECLARE_PRIVATE(MyTest);
};

class MyTestPrivate : public QxtPrivate<MyTest> {
public:
    MyTestPrivate(); // private classes must be default-constructible
    QXT_DECLARE_PUBLIC(MyTest);

    void doSomething();
};

MyTest::MyTest() {
    std::cout << "Public class init" << std::endl;
    x = 5;
    QXT_INIT_PRIVATE(MyTest);
}

void MyTest::doSomething() {
    qxt_d().doSomething();
}

MyTestPrivate::MyTestPrivate() : QxtPrivate<MyTest>() {
    std::cout << "Private class init" << std::endl;
}

void MyTestPrivate::doSomething() {
    std::cout << "Something! x=" << qxt_p().x << std::endl;
}

class SubTestPrivate;
class SubTest : public MyTest {
public:
    SubTest();

    void doSomethingElse();

    int y;

private:
    QXT_DECLARE_PRIVATE(SubTest);
};

class SubTestPrivate : public QxtPrivate<SubTest> {
public:
    SubTestPrivate();
    QXT_DECLARE_PUBLIC(MyTest);

    void doSomething();
};

SubTest::SubTest() : MyTest() {
    std::cout << "Subclass init" << std::endl;
    y = 3;
    QXT_INIT_PRIVATE(SubTest);
}

void SubTest::doSomethingElse() {
    qxt_d().doSomething();
}

SubTestPrivate::SubTestPrivate() : QxtPrivate<SubTest>() {
    std::cout << "Private subclass init" << std::endl;
}

void SubTestPrivate::doSomething() {
    std::cout << "Something else! y=" << qxt_p().y << std::endl;
}

int main(int argc, char** argv) {
    SubTest x;

    x.doSomething();
    x.doSomethingElse();
}
Personal tools