You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:55:57