我已经设法初始化了任何基本类型的变量(即int,char,float等),但是当声明一个复杂的变量时,我只能看到错误。
在头文件timer.h中我声明
class AndroidTimerConcept {
...
private:
//struct that holds the necessary info for every event
struct Resources{
timer_delegate_t membFunct;
void *data;
int size;
millis_t time;
};
//declaring an array of 10 Resources structs
static struct Resources ResData;
static int best;
...
}
在timer.cpp文件中
#include <iostream>
#include "timer.h"
using namespace std;
int AndroidTimerModel::best=1000;
struct Resources AndroidTimerModel::ResData.size; //line 17!!
//constructor that initializes all the necessary variables
AndroidTimerModel::AndroidTimerModel()
{
signal(SIGALRM,signalHandler);
for(int i=0; i<MAX_EVENTS; i++)
{
//ResData.data=NULL;
ResData.size=-1;
//ResData.time=-1;
}
best=1000;
}
编译.cpp文件时出现错误: timer.cpp:7:错误:'。'标记之前的预期初始化程序
任何建议都会非常有用。
btw我使用g ++
答案 0 :(得分:6)
您不会在静态成员中单独定义单个实例成员。
这应该足够了:
AndroidTimerModel::Resources AndroidTimerModel::ResData;
答案 1 :(得分:5)
您可以在C ++中使用struct初始化程序,但只能使用C99之前的样式(即,您不能使用指定的初始值设定项)。 指定的初始化程序,允许您指定要按名称初始化的成员,而不是依赖于声明顺序,是在C99中引入的,但目前不是任何C ++标准的一部分(依赖于C ++是C)的超集的常见假设。
如果您愿意编写专门针对g ++的非可移植C ++代码,则可以始终使用与指定构造函数具有相同功能的GCC-specific extension。语法如下:
struct value_t my_val = { member_a: 1, member_b: 1.2f };
This reference提供了对C上下文中两种初始化类型的非常好的概述。
这是一段摘录,展示了早期(没有指示符)和C99样式:
初始化结构时,列表中的第一个初始值设定项 初始化第一个声明的成员(除非指定者是 指定)(自C99起),以及所有后续的初始化程序 指示符(自C99起)初始化之后声明的结构成员 由前一个表达式初始化的那个。
struct point {double x,y,z;} p = {1.2, 1.3}; // p.x=1.2, p.y=1.3, p.z=0.0
div_t answer = {.quot = 2, .rem = -1 }; // order of elements in div_t may vary
在某些情况下,您可能需要编写一些代码来初始化结构,在这种情况下,您可以使用函数的结果,如:
struct Resources AndroidTimerModel::ResData = function_that_acts_like_a_constructor();
答案 2 :(得分:1)
您需要为struct Resources
声明和定义构造函数。
例如
struct Resources{
timer_delegate_t membFunct;
void *data;
int size;
millis_t time;
Resources():membFunct(0), data(0), size(0), time(0) {}
....
};
答案 3 :(得分:0)
您需要初始化整个结构变量,如下所示:
AndroidTimerConcept::Resources AndroidTimerModel::ResData = { NULL, NULL, 0, 0 };
答案 4 :(得分:0)
是AndroidTimerModel还是AndroidTimerConcept,你不能使用不同的名称,并期望编译器认为它们是相同的。
您需要将名称范围限定为资源,它不在全局范围内,它位于AndroidTimerModel类的范围内:
AndroidTimerModel::Resources AndroidTimerModel::ResData;
我建议你给Resources一个构造函数:
struct Resources{
Resources(timer_delegate_t aMembFunct, void* aData, int aSize, millis_t aTime )
: membFunc(aMembFunct)
, data(aData)
, size(aSize)
, time(aTime)
{}
timer_delegate_t membFunct;
void *data;
int size;
millis_t time;
};
然后您可以在.cpp中将Res定义为:
AndroidTimerModel::Resources AndroidTimerModel::ResData(/* params here */);
答案 5 :(得分:-3)
为什么你的struct
课程的一部分?我会在全班以外的地方做到全球化。
memset(&structname, 0, sizeof(structname));
会将您的结构初始化为0。