[[tridy]]
 
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
struct C
{
    int x, y;
 
    void (*set) (C * t, int a, int b);
    void (*move) (C * t, int a, int b);
 
    // virtual void set (int a, int b) { x=a; y=b; }
    // virtual void move (int a, int b) { x=x+a; y=y+b; }
    // C (int aa, int bb) : a (aa) , b (bb) { }
};
 
void C_set_impl (C * t, int a, int b) { t->x=a; t->y=b; }
void C_move_impl (C * t, int a, int b) { t->x += a; t->y += b; }
 
C *  C_new (C * t = NULL)
{
  C * v = t;
  if (v == NULL)
     v = (C*) malloc (sizeof (C));
  v->set = C_set_impl;
  v->move = & C_move_impl;
  v->x = 0;
  v->y = 0;
  return v;
}
 
struct D
{
    C   old;
    int r;
    // virtual void set (int a, int b) { C::set (a,b); r = 1; }
    // D (int a, int b) : C (a, b) , r (0) { }
};
 
void D_set_impl (D * t, int a, int b) { C_set_impl (&t->old, a, b);  t->r=1; }
 
void D_set_jump (C * t, int a, int b) { D_set_impl ((D*) t, a, b); }
 
typedef void (*T) (C*, int, int);
 
D * D_new (D * t = NULL)
{
    D * v = t;
    if (v == NULL)
       v = (D*) malloc (sizeof (D));
    C_new (&v->old);
    v->old.set = D_set_jump;
    v->old.set = ( void (*) (C*, int, int) ) D_set_impl;
    v->old.set = ( T ) D_set_impl;
    v->r = 0;
    return v;
}
 
// D * create (int a, int b) { return new D (a, b); }
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    // C * v = D_new ();          // C * v = new D ();
    D * w = D_new ();
    C * v = & (w->old);
    // C * v = & D_new ()->old;
    // C * v = (C*) D_new ();
 
    // C_set_impl (v, 10, 20);    // v->C::set (10, 20);
    v->set (v, 10, 20);        // v->set (10, 20);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
tridy.txt · Last modified: 2016/10/21 10:37 by 147.32.6.116
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki