如何避免使用引用分配内存?

时间:2017-04-18 17:59:33

标签: c++ c++11

#include <iostream>
#include <string>

struct A {
    A(std::string s) { name = s; }

    std::string name;
};

struct B {
    B(std::string s) : a(A(s)) {}

    A& a;
};

int main() {
    B b("tom");

    std::cout << b.a.name << std::endl;
}

我正在尝试分配class B的A&amp; a与A's object。我可以做的几种方式。

1)制作A&amp; a到A * a并在B的构造函数中执行a = new A(s)。这有效,但我试图避免这种情况,因为我必须做新的删除。

2)上面我有class B,它接受​​字符串并创建一个右值对象来初始化左值引用。这将导致编译错误。

3)我可以A& aA&& a,但不确定这是否合适。因为它编译但cout给垃圾。

4)在main中创建A的实例并将其传递给B的构造函数。但我现在试图避免这种情况。

2 个答案:

答案 0 :(得分:4)

您不需要引用,指针或类似内容。

你只需要一个A类型的对象,就像那样简单。

另外,您可以使用移动语义来避免所有副本:

#include <iostream>
#include <string>
#include <utility>

struct A
{
    A(std::string s) : name(std::move(s)) {}

    std::string name;
};

struct B
{
   B(std::string s) : a(std::move(s)) {}

   A a;
};

int main()
{
    B b("tom");

    std::cout << b.a.name << std::endl;
}

答案 1 :(得分:2)

正确和好的代码看起来像这样:

struct A
{
    A(std::string name) : name_(std::move(name)) {}

    std::string name_;
};

struct B
{
    B(std::string name) : a_(std::move(name)) {}

    A a_;
};