将Dynamic Struct Array复制到另一个C ++中

时间:2014-07-08 07:11:12

标签: c++ arrays dynamic struct

我的英语不太好,这就是为什么我的问题可能错了。但我有一个问题,我不知道如何解决它,或者它是否可能做到。

我定义了2个Structs:

typedef struct
{
  UINT16        ScriptNumber;
  std::string   ScriptText;
} StepStruct;


typedef struct
{
  std::string               SequenceName;
  std::string               DisplayName;
  StepStruct                SequenceSteps;
} SequenceStruct;

如您所见,第一个Struct是第二个结构的成员。所以我希望这两种结构都是动态的。所以我从类型StepStruct创建了2个动态数组,从类型SequenceStruct创建了1个动态数组。

Type StepStructs 的两个动态数组定义如下:

StepStruct gsFirstSkript[] =
{    
  { 1 , "SkriptText One"},
  { 2 , "SkriptText Two"},
  { 45, "SkriptText Three"}
}

StepStruct gsSecondSkript[] =
{    
  { 48, "SkriptText One"},
  { 2 , "SkriptText Two"},
  { 45, "SkriptText Three"}
}

结构的那些属于StepStruct类型。现在我想使用SequenceStruct类型执行相同操作,但我想在Struct Member SequenceSteps下分配我已经拥有的两个数组。我的意思如下:

SequenceStruct gsSequenceList[] =
{    
  { "FirstScript", "Test One", gsFirstSkript},
  { "SecondScript", "Test Two", gsSecondSkript}
}

如果我现在想要阅读会员 gsSequenceList ,我无法访问 SequenceSteps 索引下的任何信息!什么意思,数据不被复制!我用指针试了一下 但没有成功。

UINT16 lTestVal = gsSequenceList[0].SequenceSteps[2].ScriptNumber;

那么我可以判断这是否有效,并且lTestVal包含值45?

1 个答案:

答案 0 :(得分:5)

typedef struct
{
  std::string               SequenceName;
  std::string               DisplayName;
  StepStruct*               SequenceSteps;
} SequenceStruct;

这将允许代码编译,并且您显示的测试片段将起作用。 但是,这不会复制数据。如果您更改gsFristSkript,它也会在gsSequenceList中更改。如果要复制数据,可以明确地执行此操作,使用构造函数或仅使用向量<>。 这是带向量的解决方案:

#include <vector>
...
typedef struct{
  std::string               SequenceName;
  std::string               DisplayName;
  vector<StepStruct>        SequenceSteps;
} SequenceStruct;

vector<StepStruct> gsFirstSkript =
{    
  { 1 , "SkriptText One"},
  { 2 , "SkriptText Two"},
  { 45, "SkriptText Three"}
}

vector<StepStruct> gsSecondSkript =
{    
  { 48, "SkriptText One"},
  { 2 , "SkriptText Two"},
  { 45, "SkriptText Three"}
}

SequenceStruct gsSequenceList[] =
{    
  { "FirstScript", "Test One", gsFirstSkript},
  { "SecondScript", "Test Two", gsSecondSkript}
}