结合使用复制构造函数 std::make_shared
Using copy-constructor in conjuction with std::make_shared
我定义了一个包含 int
值的简单 class Integer
,调用 std::make_shared<Integer>(&ref)
将强制程序使用接受 int
的构造函数.我是否实施了错误的复制构造函数,或者我使用 std::make_shared
有问题?
调用std::make_shared<Integer>(ref)
有什么区别?
另外,为什么 Integer copied_integer(integer);
不使用复制构造函数? Integer copied_integer(&integer);
也是不允许的。
这是代码
#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;
}
改变这个:
auto pointer = std::make_shared<Integer>(&ref);
对此:
auto pointer = std::make_shared<Integer>(ref);
因为您应该收到类似于以下内容的错误:
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) {}
| ~~~~^~~~~~
informs/reminds你ref
是const Integer*
类型,你只需要const Integer&
,也就是复制构造函数中参数的类型。
我定义了一个包含 int
值的简单 class Integer
,调用 std::make_shared<Integer>(&ref)
将强制程序使用接受 int
的构造函数.我是否实施了错误的复制构造函数,或者我使用 std::make_shared
有问题?
调用std::make_shared<Integer>(ref)
有什么区别?
另外,为什么 Integer copied_integer(integer);
不使用复制构造函数? Integer copied_integer(&integer);
也是不允许的。
这是代码
#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;
}
改变这个:
auto pointer = std::make_shared<Integer>(&ref);
对此:
auto pointer = std::make_shared<Integer>(ref);
因为您应该收到类似于以下内容的错误:
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) {}
| ~~~~^~~~~~
informs/reminds你ref
是const Integer*
类型,你只需要const Integer&
,也就是复制构造函数中参数的类型。