2013-09-24 60 views
0

這是我的代碼。編譯時指針「沒有類型」?

struct player 
    { 
    char* name; 
    int* id; 
    id = new int[5]; 
    }; 

當我編譯,它說:「錯誤:‘ID’不名一型」,指向行,其中指針5個整數分配的空間就行了。

不要問我爲什麼我需要一個整數數組;這是一個班級項目,是必需的(我們的老師喜歡讓我們做不必要的事情給我們練習)。

+0

接受一個答案plz – hasan83

+0

@Kerrek SB:除了這種語法不是內聯初始值設定項的正確語法。 – AnT

+0

今天的方法是'std :: array id',你的老師仍在使用字面上屬於20世紀的技術。 – MSalters

回答

2

試試這個:

struct player 
    { 
    char *name; 
    int id[5]; 
    }; 
+0

我會,但必須聲明所有使用該程序動態分配的數組。因此,我不能以這種方式聲明數組。 – Bobazonski

+0

@ user1362548:請參閱下面的AndreyT的回答。 – thokra

1

不能在結構類型的代碼行。 您只能定義變量。結構預計你正在定義一個新的變量。因此,錯誤說ID不是像int和char這樣的類型定義。

如果你堅持使用指針,你可以在結構體外完成這個初始化。

a.id = new int[5]; 

裏面像其他答案:

struct player 
{ 
    char *name; 
    int id[5]; 
}; 
+1

你不能在struct中有_statements_。 – MSalters

+0

另外,這不是初始化。當你可以給'player'實例的成員賦值時,'int *'將會被初始化爲「垃圾」,即有一個未定義的值。 – thokra

3

你是怎麼想出這個代碼和你期望它做什麼?

此行

id = new int[5]; 

看起來像一個表達式語句。這個語句在類定義中做了什麼?表達式語句屬於函數內部,而不是其他地方。您不允許將它們注入到類定義中。他們不屬於那裏。這是編譯器告訴你的那個錯誤信息:它期望下一個成員聲明的類型名稱,而是看到以id開頭的東西,並且通常在該上下文中沒有意義。

如果您嘗試使用內聯初始化,正確的語法將

struct player 
{ 
    char* name; 
    int* id = new int[5]; 
}; 

初始化程序已是聲明的一部分,如上圖所示。你不能把它分解成單獨的語句,把它放入類定義中,並期望編譯器找出你的意思。

否則(即如果你不嘗試使用內聯初始化),你必須在構造函數初始化player::id

struct player 
{ 
    char* name; 
    int* id; 

    player(): id(new int[5]) 
    {} 
    ... 
}; 

(例如類的正確實施需要三個規則如下當然。)

或者你可以從外部初始化它。這裏的正確方法取決於你的意圖。

+0

儘管我希望在可能缺少'std :: array'的情況下,除非OP明確指出銷燬是在'player's'dtor之外處理的,否則我建議您添加適當的實現。 – thokra

+0

@thokra:不。OP明確指出這是一項「培訓」任務。儘管我不能完全猜測他們想學什麼,但原始語法建議通過結構指針引用分配的獨立數組。同時,'std :: array'會實現一個「嵌入」數組,這是完全不同的事情。 'std :: array'只是一個更加文明的'int id [5]'。由於他們從一開始就不使用'int id [5]',我認爲'std :: array'也不是「合適的實現」。 – AnT

+0

@thokra:最有可能暗示的是,在一般情況下,數組大小不會由編譯時間常量指定,這就是爲什麼他們在運行時分配它的原因。這會立即排除'std :: array'的考慮。在這種情況下,原始數組的正確替換將是'std :: vector',而不是'std :: array'。然而,無論如何,我不想用基於絕望缺乏信息的猜測來混淆我的回答。我只是直接回答這個問題。 – AnT