构造函数移动
Constructor move
我有一个代码:
#include "stdafx.h"
#include "memory"
#include <gtest\gtest.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;
}
我想在银行存入 display(returnMoney()) 钱,但我不能。我可以用 struct Impl 和 unique_ptr 制作 class 进行训练。
我知道,那个独一无二的东西是无法复制的。
我怎样才能制作这个程序?
我的其余代码是否正常?
错误
Error C2027 use of undefined type 'Bank::PropertiesBank' Error
C2039 'returnValue': is not a member of 'std::unique_ptr>'
这不是 std::unique_ptr
的问题,问题在于您在编译器尚未看到其完整定义时尝试访问类型为 PropertiesBank
的对象的成员。您应该将成员函数的定义移到 class 之外,并且在编译器已经看到 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
的 type 定义的位置之后:
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(); }
我能看到的唯一问题是 Bank::returnMoney
的定义试图访问 Bank::PropertiesBank
时它只是前向声明,没有定义。将 PropertiesBank
移动到 Bank
内定义倾斜可以解决此问题。
然而,正如 Mooing Duck 在评论中指出的那样,如果您打算实施 pImpl idiom,那么 Bank::PropertiesBank
和 Bank::returnMoney
都应该在 .cpp 文件中定义,而不是在 class 定义中。
#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;
}
我有一个代码:
#include "stdafx.h"
#include "memory"
#include <gtest\gtest.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;
}
我想在银行存入 display(returnMoney()) 钱,但我不能。我可以用 struct Impl 和 unique_ptr 制作 class 进行训练。 我知道,那个独一无二的东西是无法复制的。 我怎样才能制作这个程序? 我的其余代码是否正常?
错误
Error C2027 use of undefined type 'Bank::PropertiesBank' Error
C2039 'returnValue': is not a member of 'std::unique_ptr>'
这不是 std::unique_ptr
的问题,问题在于您在编译器尚未看到其完整定义时尝试访问类型为 PropertiesBank
的对象的成员。您应该将成员函数的定义移到 class 之外,并且在编译器已经看到 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
的 type 定义的位置之后:
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(); }
我能看到的唯一问题是 Bank::returnMoney
的定义试图访问 Bank::PropertiesBank
时它只是前向声明,没有定义。将 PropertiesBank
移动到 Bank
内定义倾斜可以解决此问题。
然而,正如 Mooing Duck 在评论中指出的那样,如果您打算实施 pImpl idiom,那么 Bank::PropertiesBank
和 Bank::returnMoney
都应该在 .cpp 文件中定义,而不是在 class 定义中。
#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;
}