简体   繁体   English

将copy-constructor与std :: make_shared结合使用

[英]Using copy-constructor in conjuction with std::make_shared

I have defined a simple class Integer containing an int value, calling std::make_shared<Integer>(&ref) will force the program to use the constructor accepting an int . 我已经定义了一个包含int值的简单类Integer ,调用std::make_shared<Integer>(&ref)将强制程序使用接受int的构造函数。 Did I implemented a wrong copy-constructor or there's something wrong with my using of std::make_shared ? 我是否实现了错误的复制构造函数,或者使用std::make_shared什么问题? What's the difference of calling std::make_shared<Integer>(ref) ? 调用std::make_shared<Integer>(ref)什么区别? Also, why isn't Integer copied_integer(integer); 另外,为什么不是Integer copied_integer(integer); make use of the copy-constructor? 利用复制构造函数? Integer copied_integer(&integer); is not allowed as well. 也不允许。

Here is the code 这是代码

#include <memory>
#include <iostream>
#include "DoubleLinkedList.h"

class Integer {
private:
    int number;
public:
    Integer(int number) : number(number) {}

    Integer(const Integer &integer) : number(integer.number) {}

    Integer& operator=(const Integer& other) {
        if (this != &other) {
            number = other.number;
        }

        return *this;
    }

    int get() { return number; }

};

int main() {


    Integer integer(30);
    const Integer &ref = integer;
    Integer copied_integer(integer);
    auto pointer = std::make_shared<Integer>(&ref);
    auto sp = std::make_shared<Integer>(10);
    std::cout << "sp -> " << sp->get() << std::endl;
    std::cout << "pointer -> " << pointer->get() << std::endl;
    return 0;
}

Change this: 改变这个:

auto pointer = std::make_shared<Integer>(&ref);

to this: 对此:

auto pointer = std::make_shared<Integer>(ref);

since you should have received an error similar to: 因为你应该收到类似于的错误:

gcc-head/include/c++/10.0.0/ext/new_allocator.h:150:20: error: invalid conversion from 'const Integer*' to 'int' [-fpermissive]
  150 |  noexcept(noexcept(::new((void *)__p)
      |                    ^~~~~~~~~~~~~~~~~~
      |                    |
      |                    const Integer*
  151 |        _Up(std::forward<_Args>(__args)...)))
      |        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.cc:8:17: note:   initializing argument 1 of 'Integer::Integer(int)'
    8 |     Integer(int number) : number(number) {}
      |             ~~~~^~~~~~

which informs/reminds you that ref is of type const Integer* , and you just need const Integer& , which is the type of the parameter in that copy constructor. 通知/提醒你refconst Integer*类型,你只需要const Integer& ,它是该拷贝构造函数中参数的类型。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM