我有一个结构的构造函数,例如
struct MyStruct{
int age;
string name;
MyStruct_Two * link;
Mystruct( int age , string name , MyStruct_Two temp){
this -> age = age;
this -> name = name;
this -> link = temp;
}
}
我想做的是创建vector<MyStruct> v
来保存这些结构。但是每个结构都有指向另一个数组中另一个结构的指针。
我创建了一个使其成为真实的函数
vector<MyStruct> v
vector<MyStruct_Two> v_two
void AddStructToStruct( int age , string name ,vector<MyStruct> &v , vector <MyStruct_Two & v_two ){
MyStruct_Two temp( age , name ); // create struct
v.push_back( MyStruct( age , name , *temp ) ); // put pointer as arg
v_two.push_back( temp );
}
这引发:
错误:不匹配'operator *'。
我试图将引用甚至指针引用到引用。我在使用指针方面不是很有经验,所以我无法弄清楚如何清楚地做到这一点。
如何通过参数赋值指针?
答案 0 :(得分:2)
您可以使用&
获取某些对象的内存地址,但是......
推入矢量会复制(或移动)对象。因此退出函数范围后指针将悬空。
如果改为:
vector<MyStruct> v
vector<MyStruct_Two *> v_two
void AddStructToStruct( int age , string name ,vector<MyStruct> &v , vector <MyStruct_Two *> & v_two ){
MyStruct_Two *temp = new MyStruct_Two( age , name );
v.push_back( MyStruct( age , name , temp ) );
v_two.push_back( temp );
}
这可能会像您想要的那样工作,但您以后还必须delete
所有对象。
答案 1 :(得分:1)
正如评论中所指出的,你应该停下来并尝试学习如何正确使用指针。
您的变量temp不是指针,它是结构本身,因此您无法使用*运算符取消引用它。使这部分代码正确的可能改变是:
struct MyStruct{
int age;
string name;
MyStruct_Two * link;
//temp here is a pointer now and expects a address to point to as a parameter.
Mystruct( int age , string name , MyStruct_Two *temp){
this -> age = age;
this -> name = name;
this -> link = temp;
}
}
void AddStructToStruct( int age , string name ,vector<MyStruct> &v , vector <MyStruct_Two & v_two ){
MyStruct_Two temp( age , name ); // create struct
v.push_back( MyStruct( age , name , &temp ) ); // pass the address of the structre.
v_two.push_back( temp );
}
不确定将本地创建的变量的引用传递给struct。
我通常更喜欢使用指针代替&amp;并创建一个动态分配,以便所有内容都指向堆而不是堆栈中的变量。
答案 2 :(得分:0)
您应该使用shared_ptr而不是原始指针。它会真正阻止你从与指针生命周期相关的许多错误。
vector<MyStruct> v
vector<shared_ptr<MyStruct_Two>> v_two
void AddStructToStruct( int age , string name ,vector<MyStruct> &v , vector <shared_ptr<MyStruct_Two>> & v_two ){
shared_ptr<MyStruct_Two> temp( new MyStruct_Two(age, name) );
v.push_back( MyStruct( age , name , temp ) );
v_two.push_back( temp );
}
我觉得最好还是为MyStruct使用共享指针。