为何无法在GObject中定义可派生类型的实例结构?
我想用GObject模仿的结构
以下是一个简单的C++示例:
#include <iostream> using std::cout; using std::endl; class Matrix { public: Matrix (int rows, int cols) { this->rows = rows; this->cols = cols; this->coeffs = 0; }; int rows, cols; double *coeffs; }; class SymmetricMatrix final : public Matrix { public: SymmetricMatrix (int size) : Matrix (size, size) { this->size = size; this->nb_coeffs = size*(size-1)/2; this->coeffs = new double[this->nb_coeffs](); }; int size, nb_coeffs; void print_self () { for (int i=0; i<this->nb_coeffs; i++) { cout << this->coeffs[i] << " "; } cout << endl; }; }; int main () { SymmetricMatrix S (6); S.print_self (); cout << S.cols << endl; // 访问父类的公共成员变量! return 0; }
目前我的进展
我想要复制上述C++类结构,但使用GObject实现。
问题在于: 我不清楚如何为可派生基类定义并继承公共变量。由于G_DECLARE_DERIVABLE_TYPE已经定义了实例结构,我无法重新定义它……为什么不能这么做?
以下是我目前的代码实现^1。据我理解,这是不可能的,因为GObject不是C++,二者的通用范式不同。
tmatrix.h
#ifndef TMATRIX_H #define TMATRIX_H #include <glib-object.h> #define T_TYPE_MATRIX t_matrix_get_type() G_DECLARE_DERIVABLE_TYPE (TMatrix, t_matrix, T, MATRIX, GObject) struct _TMatrixClass { GObjectClass parent_class; }; // struct _TMatrix { // GObject parent_instance; // gint nrows; // gint ncols; // gdouble *coeffs; // }; /* 公共函数 */ TMatrix *t_matrix_new (int ncols, int nrows); #endif
tmatrix.c
#include "tmatrix.h" G_DEFINE_TYPE (TMatrix, t_matrix, G_TYPE_OBJECT) void t_matrix_class_init (TMatrixClass *class) {} void t_matrix_init (TMatrix *instance) {} TMatrix *t_matrix_new (gint ncols, gint nrows) { TMatrix *matrix = g_object_new (T_TYPE_MATRIX, NULL); // matrix->cols = ncols; // matrix->rows = nrows return matrix; }
tsymmetricmatrix.h
#ifndef TSYMETRICMATRIX_H #define TSYMETRICMATRIX_H #include "tmatrix.h" #include <glib-object.h> struct _TSymmetricMatrix { TMatrix parent_object; // 公共成员 gint size; }; #define T_TYPE_SYMMETRIC_MATRIX t_symmetric_matrix_get_type () G_DECLARE_FINAL_TYPE (TSymmetricMatrix, t_symmetric_matrix, T, SYMMETRIC_MATRIX, TMatrix) /*公共类方法*/ void t_symmetric_matrix_print (TSymmetricMatrix *self); /*命名空间公共函数*/ TSymmetricMatrix *t_symmetric_matrix_new (gint size); #endif
tsymmetricmatrix.c
#include "tsymmetricmatrix.h" G_DEFINE_FINAL_TYPE (TSymmetricMatrix, t_symmetric_matrix, T_TYPE_MATRIX) void t_symmetric_matrix_class_init (TSymmetricMatrixClass *class) {} void t_symmetric_matrix_init (TSymmetricMatrix *instance) {} void t_symmetric_matrix_print (TSymmetricMatrix *self) { // 打印代码 } TSymmetricMatrix *t_symmetric_matrix_new (gint size) { TSymmetricMatrix *matrix = g_object_new (T_TYPE_SYMMETRIC_MATRIX, NULL); // // 我不知道接下来该做什么…… return matrix; }
main.c
#include "tmatrix.h" #include "tsymmetricmatrix.h" int main () { TSymmetricMatrix *A = t_symmetric_matrix_new (3); t_symmetric_matrix_print(A); return 0; }
内容的提问来源于stack exchange,提问作者Gabs
相关产品推荐
相关产品推荐

