2011-04-18 47 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