2017-02-15 75 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稍微解释了一下,然后你再深入一点。我很感激。 :) –

相关问题