构造函数移动
Constructor move
我有一个代码:
#include "stdafx.h"
#include "memory"
#include <gtestgtest.h>
class Money
{
public:
explicit Money(int value) :value(value) {} ;
Money(Money&& m) :value(m.returnValue()) {};
Money(const Money &m) = default;
Money operator-(const Money &m) ;
Money &operator=(Money &&m) { return Money(m.returnValue()); };
Money &operator=(const Money &m)=default;
int returnValue() const { return value; };
~Money() = default;
private:
int value;
};
Money Money::operator-(const Money &m)
{
return Money(value - m.returnValue());
}
class Bank {
public:
Bank(Money m) :propertiesBank(std::make_unique<PropertiesBank>(std::move(m))) {};
int returnMoney() const { return propertiesBank->money->returnValue(); }
~Bank() = default;
private:
struct PropertiesBank;
std::unique_ptr<PropertiesBank> propertiesBank;
};
struct Bank::PropertiesBank
{
std::shared_ptr<Money> money;
PropertiesBank(Money&& m) :money(std::make_shared<Money>(m)) {};
};
int main()
{
Money k(1000);
Bank bank(k);
return 0;
}
我想在银行里显示(returnMoney())钱,但我不能。我可以用结构 Impl 和 unique_ptr 进行培训。 我知道,那个独特的无法复制。如何制作此程序?我的其余代码是否正常?
错误
错误 C2027 使用未定义的类型"银行::P银行"错误
C2039 'returnValue': 不是 'std::unique_ptr>' 的成员
我能看到的唯一问题是,当Bank::returnMoney
的定义仅被向前声明而不是定义时,它会尝试访问Bank::PropertiesBank
。将要定义的PropertiesBank
移动到Bank
内可以解决此问题。
然而,正如Mooing Duck在评论中指出的那样,如果你的目的是实现pImpl习惯用法,那么Bank::PropertiesBank
和Bank::returnMoney
都应该在.cpp文件中定义,而不是在类定义中定义。
#include <memory>
class Money
{
public:
explicit Money(int value) :value(value) {} ;
Money(Money&& m) :value(m.returnValue()) {};
Money(const Money &m) = default;
Money operator-(const Money &m) ;
Money operator==(Money &&m) { return Money(m.returnValue()); };
int returnValue() const { return value; };
~Money() = default;
private:
int value;
};
Money Money::operator-(const Money &m)
{
return Money(value - m.returnValue());
}
class Bank {
public:
Bank(Money m) :propertiesBank(std::make_unique<PropertiesBank>(std::move(m))) {};
int returnMoney() const { return propertiesBank->money->returnValue(); }
~Bank() = default;
private:
struct PropertiesBank
{
std::shared_ptr<Money> money;
int returnMoney() const { return money->returnValue(); }
PropertiesBank(Money&& m) :money(std::make_shared<Money>(m)) {};
};
std::unique_ptr<PropertiesBank> propertiesBank;
};
#include <iostream>
int main()
{
Money m(10);
Bank b(m);
std::cout << b.returnMoney();
return 0;
}
这不是
std::unique_ptr
的问题,而是您尝试访问类型为PropertiesBank
的对象的成员,而编译器尚未看到其完整定义。您应该将成员函数的定义移到类之外,并在编译器看到PropertiesBank
的完整定义的位置:
请参阅下面此代码段中的评论:
class Bank {
public:
Bank(Money m) :propertiesBank(std::make_unique<PropertiesBank>(std::move(m))) {};
int returnMoney() const;{ return propertiesBank->money->returnValue(); }
// .......The compiler doesn't know that `money`^^^^^^ belongs to `PropertiesBank`
~Bank() = default;
private:
struct PropertiesBank;
std::unique_ptr<PropertiesBank> propertiesBank;
};
struct Bank::PropertiesBank
{
std::shared_ptr<Money> money;
PropertiesBank(Money&& m) :money(std::make_shared<Money>(m)) {};
};
您应该将函数的定义移动到编译器看到propertiesBank
类型定义的位置:
class Bank {
public:
Bank(Money m) :propertiesBank(std::make_unique<PropertiesBank>(std::move(m))) {};
int returnMoney() const; //member function declaration
~Bank() = default;
private:
struct PropertiesBank;
std::unique_ptr<PropertiesBank> propertiesBank;
};
struct Bank::PropertiesBank
{
std::shared_ptr<Money> money;
PropertiesBank(Money&& m) :money(std::make_shared<Money>(m)) {};
};
//Member function's definition
int Bank::returnMoney() const { return propertiesBank->money->returnValue(); }
相关文章:
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 为什么调用复制构造函数而不是移动构造函数?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 移动构造函数和右值引用
- 为什么 std::memmove 中联合的默认非平凡移动构造函数C++?
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- C++:为什么不调用移动构造函数?
- 移动构造函数永远不会被调用
- C++:关于使用 Stroustrup 示例移动构造函数/赋值的问题
- 运算符+ 的规范实现涉及额外的移动构造函数
- C ++为什么在移动构造函数中需要移动/前进
- 为什么在删除"移动构造函数"时使用"复制构造函数"?
- 为什么这里不调用移动构造函数?
- 隐式移动构造函数
- 如何为具有私有成员的派生类实现移动构造函数
- 为什么不调用移动构造函数
- 是否可以避免在以下代码中复制/移动构造函数的需要?