2011-04-18 44 views
6

我已经设法初始化正确的任何基本类型的变量(即int,char,float等),但是当声明一个复杂的变量时,所有我能看到的都是错误。如何在C++中初始化一个静态结构?

在头文件timer.hi编译.cpp文件时声明

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; 

} 

内我得到的错误: timer.cpp:7:错误:'。'之前的预期初始化器令牌

任何建议都会非常有帮助。

顺便说一句,我使用G ++

回答

-3

为什么是你的一类struct一部分?我会让它在课堂之外成为全球性的。

memset(&structname, 0, sizeof(structname));将初始化结构为0

4

您可以使用C++中的结构初始化,但只能在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风格:

When initializing a struct, the first initializer in the list initializes the first declared member (unless a designator is specified) (since C99), and all subsequent initializers without designators (since C99) initialize the struct members declared after the one initialized by the previous expression.

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(); 
+0

你的链接不再工作,虽然你的答案仍然存在对有同样问题的人有价值。你能更新它吗? – VisorZ 2016-09-16 08:07:47

+0

我更新了一个不太可能腐烂的链接,并且在这个问题中包含了一个摘录。 – BeeOnRope 2016-09-19 16:42:49

0

您需要初始化整个结构变量,像这样:

AndroidTimerConcept::Resources AndroidTimerModel::ResData = { NULL, NULL, 0, 0 }; 
+0

初始化器没有效果,所有具有静态生命周期的变量在执行开始之前都是零初始化的。 – 2011-04-18 19:24:05

+1

确实如此,但如果OP想要将任何字段初始化为非零值,则这是要使用的语法。 – pmdj 2011-04-18 19:35:24

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) {} 
    .... 
}; 
+0

如果使用'Resources'来声明具有自动或成员生命期的变量,那么它很有用。 – 2011-04-18 19:25:55

+0

或作为“静态”变量。 – quamrana 2011-04-18 19:31:17

+0

静态生命期的变量已经被初始化了,你不需要为它写一个构造函数。 – 2011-04-18 19:53:01

6

无需单独的静态成员中定义单个实例成员。

这应该是足够了:

AndroidTimerModel::Resources AndroidTimerModel::ResData; 
+0

Thanx工作:D – filippos 2011-04-18 22:14:06

+0

@菲利波斯请标明解决方案 - 答案接受:) – 2015-03-04 12:50:54

0

它是AndroidTimerModel或AndroidTimerConcept,您不能使用不同的名称和期望编译器认为他们是同样的事情。

您需要范围的名称资源,这不是在全球范围内,它在AndroidTimerModel类的范围:

AndroidTimerModel::Resources AndroidTimerModel::ResData; 

我建议你给资源一个构造函数:

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 */); 
+0

对不起,这是AndroidTimerModel的概念出现,因为我没有复制粘贴头问题的第一行时发布的问题.. – filippos 2011-04-18 19:41:34