2017-02-15 74 views
2

在下面的2克的樣品(以下作品的第一碼塊和第二碼下部塊不)爲什麼需要一個變量指向一個結構

#include <iostream> 
#include <vector> 
#include <string> 

struct padStruct 
{ 
    int buttonID; 
    long timeMS; 
    std::string codetoSEND; 
}; 

int main() 
{ 
    padStruct s = {0,0,""}, *s2; 
    s2 = &s; 
    s.buttonID = 3; //or (*s2).buttonID = 3; 
    s.timeMS = 1200; //or (*s2).timeMS = 1200; 
    s.codetoSEND = "play song"; //or (*s2).codetoSEND = "play song"; 
    std::cout << (*s2).buttonID << ',' << (*s2).timeMS << ',' << '"' << (*s2).codetoSEND << '"' << '\n'; 
} 

這工作。

至於反對:

#include <iostream> 
#include <vector> 
#include <string> 

struct padStruct 
{ 
    int buttonID; 
    long timeMS; 
    std::string codetoSEND; 
}; 

int main() 
{ 
    padStruct *s = {0}; 
    //padStruct *s = {0,0,""} //Error C2078 too many initializers 
    (*s).buttonID = 3; //or (*s2).buttonID = 3; 
    (*s).timeMS = 1200; //or (*s2).timeMS = 1200; 
    (*s).codetoSEND = "play song"; //or (*s2).codetoSEND = "play song"; 
    std::cout << (*s).buttonID << ',' << (*s).timeMS << ',' << '"' << (*s).codetoSEND << '"' << '\n'; 
} 

這不。

有人能簡單的介紹一下

  1. 爲什麼不能初始化padStruct * S = {0,0,「」)在底部代碼,而它的工作原理在上面,否則我得到一個錯誤C2078初始化程序太多 |

  2. 更重要的是,爲什麼我必須創建一個padStruct變量s,然後是padStruct * s2,然後必須將s2指向s?否則,我得到一個錯誤C2228:'.buttonID'的左邊必須有class/struct/union

非常混亂。也許至少解釋第二個問題有點簡單,所以它沉入。謝謝。

+2

簡短的回答是「因爲C++不能這樣工作」。重讀C++中討論指針是什麼的章節,以及它們如何工作。 –

+1

嗯..因爲在頂級版本中你有一個類對象,而在最底層的代碼中,你有一個指向類對象的指針。這兩個完全不同的東西具有完全不同的語義。 – AnT

回答

2

爲什麼不能初始化padStruct *s = {0, 0, "")

由於s是一個指針,而不是一個複合型。它可以初始化爲零,或者指向新實例padStruct,但它是單個項目。

爲什麼我要創建一個padStruct變量s然後padStruct *s2並有再點s2s

您需要初始化s2指針指向padStruct的實例。指向s是一種選擇,但還有其他選項。例如,你可以寫

padStruct *s = new padStruct { 0, 0, "" }; 

甚至

padStruct *s = new padStruct { 3, 1200, "play song" }; 

,以避免一個設置字段之一。

請注意,您可以使用s->buttonID語法來代替(*s).buttonID

+0

那很簡單。非常感謝那個清楚的解釋。 –

0

在第一嵌段中,可以定義一個實際padStruct s對象和定義另一個簡單地指針s2padStruct

padStruct s = {0,0,""}, *s2 

對於s2 = &s,使得s2的指針的s無可厚非,在s2指針s地址,這是在堆棧中分配。因此,當您將s2取消(*s2).buttonID時,該值實際上來自s。 (與s.buttonID相同)

在下一個塊中,您在做什麼是initialize a pointer with {0}。這是錯誤的。指針應該初始化爲0nullptr。而{0}只適用於POD struct

padStruct *s = {0}; 

您需要爲s準備的空間像padStruct *s = new padStruct,那麼s實際上會指向真實的東西。並記住最後刪除它。

+0

謝謝,basblinkenlight稍微解釋了一下,然後你再深入一點。我很感激。 :) –

相關問題