如何实例化智能指针类成员?

时间:2016-02-10 04:36:33

标签: c++ smart-pointers member move-semantics

我最近一直在做一些非常狡猾的智能指针编程,因为我从来没有真正理解移动构造函数,移动赋值等等,因为在像MSDN这样的地方给出的例子对我来说真的很复杂。通过狡猾,我的意思是从字面上改变像(左值+ 0)做rvalues的事情。

这是一个例子(我不善于考虑不深奥的场景):

class Person {
public:
    Person(int age) {
        age_ = age;
    }

private:
    int age_;
};

class Life {
public:
    Life(int age) {
        person_ = std::make_unique<Person>(age);
    }
private:
    std::unique_ptr<Person> person_;
};

年龄部分必须是一个左值,将这个作为右值的正确方法是什么?我已经阅读过关于移动构造函数但是它们似乎是传递对象本身的rvalue引用?

编辑:此外,是否可以从类构造函数的成员初始化列表中初始化智能指针成员?

2 个答案:

答案 0 :(得分:2)

您只需执行以下操作即可创建Person指针并将其指定给unique_ptr:

for(int i = 0; i < columns; ++i)
    {//Iterate through columns
        for(int j = 0; j < rows; ++j)
        {//Iterate through rows
            Color choice = chooseColor(rectColors);
            //Method that chooses a color

            rect = new Rectangle(horizontal*j, vertical*i, horizontal, vertical);
            //Create a new rectangle(PosY,PosX,width,height)

            rect.setStroke(choice);
            //Give rectangles an outline so I can see rectangles

            root.getChildren().add(rect);
            //Add Rectangle to board

        }
    }

答案 1 :(得分:0)

首先,如果你需要一个来自左值的右值,那么直接的方法就是std :: move(a),但重要的是要注意你正在做什么。你正在用左手方式改变你的参考资料,如果你需要,你可以改变它,因为我不再需要那些价值观&#34;。

但是在你的情况下,如果它们是rvalue或lvalue真的无关紧要,因为你的int参数是一个pass-by-copy值,这与你有一个Person(int&amp; age)或Person(int&amp;&amp;年龄),不是你的情况。

但在这种情况下很重要

std::vector<int> b = ...
std::vector<int> a = b; //rvalue, means keep safe this data, I still need them 
std::vector<int> a = std::move(b);//lvalue, could be changed
std::vector<int> a = f(); //lvalue, could be changed since is just a temporary data