2013-04-26 98 views
-1

我有這個代碼,在我看來,它接收到一個名爲Vehicle的項目,並且它必須將其存儲在名爲Node的數組中。這是關係到這部分程序代碼:C++將項目存儲到數組中

void Table::process(Vehicle v, int cont) { 
    char a='A'+cont; 
    putVehicle(a,v); 
    Node.a_v[cont]=v; 
    if(cont==0) a_surt=v.rowVehicle(); 
} 

這是我對Table.h的私處數組:

struct Node{ 
    Vehicle a_v; 
}; 

我得到的錯誤是:

error: expected primary-expression before '.' token 

我有我需要的包括,但每次我輸入:Node.a_v它給了我那個錯誤。 有什麼建議嗎?

+4

'Node'不是一個數組,它甚至不是一個變量,它是一個類型。你可以使用*類型來聲明數組或變量,但是它本身的類型不是數組或變量。你需要直接理解這些概念。 – john 2013-04-26 13:33:59

回答

3

您應該使用Node對象來訪問a_v變量。此行

Node.a_v[cont]=v; 

錯誤。你應該做這樣的事情:如果你想使用結構

Node n; 
n.a_v[cont]=v; 
+0

我該怎麼做? – 2013-04-26 13:33:30

+1

但'a_v'不是一個數組。 – 2013-04-26 13:34:28

+1

如果數組的名稱是Node,那麼'Node [cont] .a_v'另外,這是數組名稱的一個非常糟糕的選擇。 – derpface 2013-04-26 13:36:36

4

,你需要使用它之前聲明Node。此外,該結構需要包含一個數組(或更好的,看更多的靈活性vectors)。

struct Node { 
    Vehicle[10] a_v; // 10 is max number of Vehicles in array 
}; 

Node myNode; 
myNode.a_v[cont] = v; 

記住,如果你想保持這種Node過來,把更多的事情,它需要在正確的範圍內聲明。例如,爲了讓您的process功能添加到Vehicle存在的功能process之外的Node,你可以像這樣:

void Table::process(Node n, Vehicle v, int cont) { 
    char a = 'A'+cont; 
    putVehicle(a,v); 
    if (cont < 10) { 
     n.a_v[cont] = v; 
    } 
    if (cont == 0) a_surt = v.rowVehicle(); 
} 

它看起來像你只是想使用數組。在這種情況下,您正在尋找這樣的事情:

// This would go somewhere in your program. Again, 10 is just an example. 
Vehicle vehicleArray[10]; 

// Send this array to this function 
void Table::process(Vehicle[] vArray, Vehicle v, int cont) { 
    char a = 'A'+cont; 
    putVehicle(a,v); 
    if (cont < 10) { // In a real program, don't hard-code array limits. 
     vArray[cont] = v; 
    } 
    if (cont == 0) a_surt = v.rowVehicle(); 
} 
2

每次我鍵入:Node.a_v它給了我這個錯誤。

Node是一種類型;類型定義了一個對象的結構,但它們沒有它們自己的字段(除了static字段,它們一次屬於所有實例;它們的訪問方式不同)。

爲了使用.->運營商,你需要一個Node實例,像這樣:

Node x; 
x.a_v = ... 

這不是你的情況從哪裏Node情況下,應該是未來的清晰,雖然。爲了訪問它們,您需要將它們作爲參數傳遞,或者使它們靜態/全局可用(不推薦)。

0

好的,所以Node不是你的數組的名字。這是應該包含數組的用戶定義類型的名稱。但是,您的節點不包含數組。它包含一輛車,名爲a_v。我假設a_v應該代表一組車輛。因此,您需要分配數組。事情是這樣的:

struct Node { 
    Vehicle a_v[AMOUNT]; 
}; 

如果你不知道在編譯時你要多大的陣列是這樣做,那麼他們必須是動態分配的,就像這樣:

struct Node { 
    Vehicle* a_v; 
    Node() { 
     a_v = new Vehicle[AMOUNT]; 
    } 
}; 

如果它是動態分配的,那麼它也必須被釋放:

struct Node { 
    Vehicle* a_v; 
    Node() { 
     a_v = new Vehicle[AMOUNT]; 
    } 
    ~Node() { 
     delete[] a_v; 
    } 
}; 

,如果它是動態分配的,你需要添加規定複製或不能進行復印:

struct Node { 
    Vehicle* a_v; 
    Node() { 
     a_v = new Vehicle[AMOUNT]; 
    } 
    ~Node() { 
     delete[] a_v; 
    } 

    // Disable copies (with C++11 support): 
    Node(const Node&) = delete; 
    Node& operator=(const Node&) = delete; 

    // Disable copies (without C++11 support) by making them private and not defining them. 
    private: 
    Node(const Node&); 
    Node& operator=(const Node&); 
}; 

然後訪問工具之一,你需要做這樣的:

Node n; // Declare a node, which contains an array of Vehicles 
n.a_v[cont] = v; // Copy a Vehicle into the array of Vehicles 

但是請注意,如果你在這個函數聲明節點的實例,那麼它是本地一旦你的功能結束,它就會超出範圍。如果你希望它繼續超越函數調用,你需要將Node實例聲明爲你的Table的成員。

class Table 
{ 
    private: 
     Node n; 
}; 

最後,正如其他人所建議的那樣,我強烈建議您閱讀C++書籍來學習C++。我個人的建議是this book(第5版,不要買第6或7號 - 這些版本的作者是可怕的)。