构造函数移动

Constructor move

本文关键字:移动 构造函数      更新时间:2023-10-16

我有一个代码:

#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::PropertiesBankBank::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(); }