Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 C++;如何将唯一的_ptr传递给函数并仍然从多态性中获益?_C++11_Unique Ptr - Fatal编程技术网

C++11 C++;如何将唯一的_ptr传递给函数并仍然从多态性中获益?

C++11 C++;如何将唯一的_ptr传递给函数并仍然从多态性中获益?,c++11,unique-ptr,C++11,Unique Ptr,我有以下类定义: class A {...} class B : public class A {...} 和所有者类定义: class C { A* a; public: C (A* a) { this->a = a; } } class C { std::unique_ptr<A> a; public: C(std::unique_ptr<A>& a) { this->a = std::move(a); }

我有以下类定义:

class A {...}
class B : public class A {...}
和所有者类定义:

class C {
    A* a;
public: 
    C (A* a) { this->a = a; }
}
class C {
    std::unique_ptr<A> a;
public: 
    C(std::unique_ptr<A>& a) { this->a = std::move(a); }
}
然后,当我尝试调用以下命令时,一切正常:

B* b = new B();
C(b);
但我有以下所有者类定义:

class C {
    A* a;
public: 
    C (A* a) { this->a = a; }
}
class C {
    std::unique_ptr<A> a;
public: 
    C(std::unique_ptr<A>& a) { this->a = std::move(a); }
}
C类{
std::唯一的ptr a;
公众:
C(std::unique_ptr&a){this->a=std::move(a);}
}
当我尝试调用以下命令时,我得到一个编译器错误,说不能从B的unique_ptr转换为a的unique_ptr&

std::unique_ptr<B> b(new B());
C(b);
std::unique_ptr b(新b());
C(b);
我确实意识到std::unique_ptr和std::unique_ptr是不一样的。但我不确定向所属类传递唯一指针的标准协议是什么

我尝试了以下方法:

class C {
    std::unique_ptr<A> a;
public: 
    C(std::unique_ptr<A> a) { this->a = std::move(a); }
}
C类{
std::唯一的ptr a;
公众:
C(std::unique_ptr a){this->a=std::move(a);}
}

std::unique_ptr b=std::make_unique();
C(标准:移动(b));;
这是可行的,但感觉有点违反直觉,因为使用unique_ptr而不是shared_ptr的部分目的是为了不必复制内存地址,从而提高性能。但在这种情况下,它不是复制内存地址,而是创建一个全新的唯一的\u ptr,只通过值传递它,在函数超出范围后将其丢弃


注意:我使用的是VSC++11编译器,不通过可变引用传递唯一指针。你会有这样的错误

实际上,解决方案是按值传递:

class C {
    std::unique_ptr<A> a;
public: 
    C(std::unique_ptr<A> a) { this->a = std::move(a); }
}

// ...

auto b = std::make_unique<B>();
C(std::move(b));
C类{
std::unique_ptr


免责声明:我没有使用CLAN在实际的例子中编译,因为它甚至在代码< O2 O/COD>中都删除了整个代码。

给出FUNC函数一个UNIQUYPPTR:FUNC(A.GET());根据文档()<代码> STD::MaMaIOX < /C> >是C++ 14(因此您已经使用C++ 14个特性)另外,我认为在 11和14之间,<代码> STD::UNQuYGYPTR <代码>没有任何重大变化。您的<代码> C>代码>构造函数应该是:<代码> C(STD:UnQuyPPT&A):A(STD::移动(A)){} /Case>。@ SaveFix9009类C需要拥有指针,所以您的答案不能工作。(a.释放()这样,您的类就可以获得对象的所有权。@Abhishek好的,我明白了。我的看法是,当您通过指针传递函数时,并不期望所有权会被转移。因此调用方代码可能会调用指针上的delete,并导致问题。具有唯一指针作为输入参数的函数我们明确地说它将对指针的唯一性做些什么,因此需要转移所有权。因此,函数可以这样编写:public:C(A*&A){m_A=A;A=nullptr;}谢谢你的回答,你觉得用右值引用来代替它怎么样?这会比用值来代替更有效吗?如果是的话,有什么陷阱可以避免吗?@jahithber用右值引用来代替它,和创造一个新的价值是一样的。你自己试试吧!我链接了一个很棒的网站,你可以看到它的价值r不要使用代码。但存在一些缺陷:通过引用传递不会转移所有权。必须使用“移动”来通过右值引用传递,但您的值可能不会实际移动,因为接收右值的函数负责实际移动值或不移动值。我决不建议通过右值引用传递unique_ptrrence.@jahisber同样,如果你真的想得到最佳的代码,请编写基准测试并对其进行评测。任何关于性能的其他讨论都是猜测,除非你对其进行测量。我给你看的网站证明了性能是一样的。如果程序集输出不同,你担心性能,请评测你的代码。