通过参数分配指针的值

时间:2016-03-29 11:05:21

标签: c++ pointers struct

我有一个结构的构造函数,例如

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 *'。

我试图将引用甚至指针引用到引用。我在使用指针方面不是很有经验,所以我无法弄清楚如何清楚地做到这一点。

如何通过参数赋值指针?

3 个答案:

答案 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使用共享指针。