我有这些结构:
struct tcFrameConfig {
int NameF;
int NameP;
int NameH;
unsigned __int8 Length;
unsigned int Duration; };
struct tcFrameStimulus {
short Key; };
struct tcFrame {
tcFrameConfig Config;
tcFrameStimulus* Stimulus; };
int main() {
tcFrame Frame1;
tcFrame Frame2;
Frame1.Config.NameF = 0;
Frame1.Config.NameP = 0;
Frame1.Config.NameH = 0;
Frame1.Config.Length = 4;
Frame1.Config.Duration = 100;
Frame1.Stimulus = new tcFrameStimulus[Frame1.Config.Length];
Frame1.Stimulus[0] = 0;
Frame1.Stimulus[1] = 1;
Frame1.Stimulus[2] = 40;
Frame1.Stimulus[3] = 43;
ok i initialized Frame1
;现在…如果我这样做:
Frame2 = Frame1;
return 0; }
它工作,但我认为这是不对的,什么是正确的方法?,如果Frame1
是tcFrame
的动态数组呢?
更新……从
struct tcFrame {
tcFrameConfig Config;
tcFrameStimulus* Stimulus; };
i went to
struct tcFrame {
tcFrameConfig Config;
std::vector<tcFrameStimulus> Stimulus; };
编译器说
error: 'struct tcFrame' has no member named 'Stimulus'|
对这段代码进行了一些测试
int main() {
tcFrame Frame1;
tcFrame Frame2;
Frame1.Config.NameF = 0;
Frame1.Config.NameH = 0;
Frame1.Config.NameP = 0;
Frame1.Config.Length = 4;
Frame1.Config.Duration = 100;
Frame1.Stimulus = new tcFrameStimulus[Frame1.Config.Length];
Frame1.Stimulus[0].Key = 0;
Frame1.Stimulus[1].Key = 1;
Frame1.Stimulus[2].Key = 2;
Frame1.Stimulus[3].Key = 3;
Frame2 = Frame1;
Frame1.Config.NameF = 1;
Frame1.Config.NameH = 1;
Frame1.Config.NameP = 1;
Frame1.Config.Length = 4;
Frame1.Config.Duration = 200;
Frame1.Stimulus = new tcFrameStimulus[Frame1.Config.Length];
Frame1.Stimulus[0].Key = 1;
Frame1.Stimulus[1].Key = 2;
Frame1.Stimulus[2].Key = 3;
Frame1.Stimulus[3].Key = 4;
cout << Frame1.Config.NameF << endl;
cout << Frame1.Config.NameH << endl;
cout << Frame1.Config.NameP << endl;
cout << Frame1.Config.Length << endl;
cout << Frame1.Config.Duration << endl;
cout << Frame1.Stimulus[0].Key << endl;
cout << Frame1.Stimulus[1].Key << endl;
cout << Frame1.Stimulus[2].Key << endl;
cout << Frame1.Stimulus[3].Key << endl;
cout << Frame2.Config.NameF << endl;
cout << Frame2.Config.NameH << endl;
cout << Frame2.Config.NameP << endl;
cout << Frame2.Config.Length << endl;
cout << Frame2.Config.Duration << endl;
cout << Frame2.Stimulus[0].Key << endl;
cout << Frame2.Stimulus[1].Key << endl;
cout << Frame2.Stimulus[2].Key << endl;
cout << Frame2.Stimulus[3].Key << endl;
return 0; }
听说过三法则吗?
看起来你应该利用c++的面向对象部分,使tcFrame
成为一个完全成熟的对象(提示class
)。在此之后,您可以创建适当的构造函数和析构函数,以及复制构造函数和重载复制赋值。
…但是你为什么要使用动态内存呢?C++提供了std::vector
动态数组,没有令人头疼的
您必须为Frame2.Stimulus
分配内存,并将Frame1.Stimulus
的内容复制到它。
Frame2.Stimulus = new tcFrameStimulus[Frame1.Config.Length];
Frame2.Stimulus[0] = Frame1.Stimulus[0];
Frame2.Stimulus[1] = Frame1.Stimulus[1];
Frame2.Stimulus[2] = Frame1.Stimulus[2];
Frame2.Stimulus[3] = Frame1.Stimulus[3];
否则,Frame2
和Frame1
指向同一内存。如果你修改其中一个,会影响到另一个。
既然要使用c++,那么最好使用标准库中的容器,比如std::vector
、std::array
。否则,您将处理与内存相关的问题。
对于您的情况,您可以使用:
struct tcFrame
{
tcFrameConfig Config;
std::vector<tcFrameStimulus> Stimulus;
};
这样,你就可以使用:
Frame2 = Frame1;
无需担心内存分配,内存释放,从一个列表到另一个列表的数据分配等