2016-12-04 188 views
-2

试图在C中做对象定位,但我不明白。初始化OOP中的指针C-lang

我想有一个结构与功能和自身的引用。我在main之前有这个,但编译器抱怨。我如何解决它? 编译器抱怨: “初始值元素不是常量”,“未知类型名SENSOR_OBJECT”

void config_time_base(alt_u32, void*); 
void init_measurement(QUEUE *q); 
void read_accelerometerX(QUEUE *q); 
void update(QUEUE *q); 


typedef struct SENSOR_CLASS 
{ 
    char description[80]; 
    alt_u32 x_origo; 
    alt_u32 y_origo; 
    alt_u32 time_base; 
    QUEUE queue; 
    QUEUE *q; 
    void (*configure_time_base)(alt_u32, SENSOR_OBJECT*); 
    void (*reset_samples_vector)(QUEUE*); 
    void (*read_sensor)(QUEUE*); 
    void (*update_graph)(QUEUE*); 
    SENSOR_OBJECT* this; 
}SENSOR_OBJECT; 

QUEUE q1,q2,q3,q4,q5; 
QUEUE* q11 = &q1; 
SENSOR_OBJECT accelorometerX = 
    { "Accelerometer x", 
     50, 50,1,q1,q11, 
     config_time_base, 
     init_measurement, 
     read_accelerometerX, 
     update, 
     &accelorometerX 
    }; 
+1

编译器抱怨什么? –

+0

“初始化元素不是常量” “unknown typename SENSOR_OBJECT” –

+1

不要在注释中发布基本信息。请改编你的问题。 –

回答

1

您正在使用的typedef在定义类型。在您使用类型别名的地方,编译器不知道它这么替换为:

struct SENSOR_CLASS *this; 

,或者你可以让你的类型的前向声明,如:

typedef struct SENSOR_CLASS SENSOR_OBJECT; 

struct SENSOR_CLASS { 
    SENSOR_OBJECT *this; 
}; 
+0

“初始化器元素在加载时不可计算” –

2

你有一个的SENSOR_OBJECTSENSOR_OBJECT之前提到的实际上是定义:

void (*configure_time_base)(alt_u32, SENSOR_OBJECT*); // <--- mentioned here 
    SENSOR_OBJECT* this;         // <--- mentioned here 
}SENSOR_OBJECT;           // <--- defined here 

这是不允许的。

最简单的办法就是在类型定义和结构定义分离:

typedef struct SENSOR_CLASS SENSOR_OBJECT; 
struct SENSOR_CLASS { ... 

Initializer element is not constant错误告诉你,你不能用一个东西是不是一个常量表达式初始化的字段。为了解决这个问题,编写一个函数,分配SENSOR_OBJECT并从函数参数中分配(而不是初始化)其字段。这将是您执行构造函数

在切线相关的说明中,保留每个对象中的指针this没有多大意义。要访问this,您必须知道对象的地址,但该地址始终等于this

在一个不太相关的说明中,在结构中保留函数指针有点浪费内存。考虑将它们保存在一个单独的vtable对象中(每个类一个),并在该类的每个实例中都有一个指向该vtable的指针。