c++改变对象内的数据,又回到原来的状态

问题描述 投票:0回答:1

我正在尝试开发一个出于实用目的的交易模拟。 在代码末尾,我看到对象内的值已更改,但当它返回时,它会继续使用初始数据。我不明白我的错误在哪里。谢谢。

逻辑非常简单:向卖家提供代币并收到 USDT 作为回报,反之亦然。


#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <windows.h>
#include <string>

using namespace std;

int getRandomNumber(int min, int max) {
    return min + rand() % ((max + 1) - min);
}

class Wallet {
private:
    double token;
    double usdt;

public:
    Wallet(double token, double usdt) : token(token), usdt(usdt) {}

    void deposit(const string& asset, double amount) {
        if (asset == "token") {
            token += amount;
        }
        else {
            usdt += amount;
        }
    }

    void withdraw(const string& asset, double amount) {
        if (asset == "token") {
            token -= amount;
        }
        else {
            usdt -= amount;
        }
    }

    double get(const string& asset) const {
        if (asset == "token") {
            return token;
        }
        else {
            return usdt;
        }
    }

    void print() const {
        cout << "Token Amount: " << token << " | Usdt Amount: " << usdt << endl;
    }
};

int main() {
    srand(static_cast<unsigned int>(time(nullptr)));

    Wallet main(150, 5000);
    Wallet w1(150, 50);
    Wallet w2(150, 50);
    Wallet w3(150, 50);
    Wallet w4(150, 50);
    Wallet w5(150, 50);
    Wallet pool(2500, 1000);

    vector<Wallet> wallets = { w1, w2, w3, w4, w5 };
    vector<Wallet> allWallets = { main, w1, w2, w3, w4, w5, pool };

    while (true) {
        // Current Pool Price
        double price = pool.get("usdt") / pool.get("token");
        cout << "Current Price: $" << price << endl;

        for (const auto& wal : allWallets) {
            wal.print();
        }
        Sleep(3000);

        // Select a random wallet
        int ind = getRandomNumber(0, wallets.size() - 1);
        Wallet& wal = wallets[ind];
        double usdt = wal.get("usdt");
        double token = wal.get("token");
        cout << "Selected Wallet Token Amount: " << token << endl;
        cout << "Selected Wallet Usdt Amount: " << usdt << endl;
        cout << endl;

        // Transaction Amount
        int side = getRandomNumber(0, 1);
        double amount = getRandomNumber(3, 6);

        // Buy
        if (side == 0) {
            if (usdt >= amount) {
                wal.withdraw("usdt", amount);
                pool.deposit("usdt", amount);

                double tokenAmount = amount / price;
                wal.deposit("token", tokenAmount);
                pool.withdraw("token", tokenAmount);
            }
            else {
                double transferAmount = main.get("usdt") / 5;
                wal.deposit("usdt", transferAmount);
                main.withdraw("usdt", transferAmount);
                continue;
            }
        }
        else { // Sell
            double tokenAmount = amount / price;
            if (token >= tokenAmount) {
                wal.withdraw("token", tokenAmount);
                pool.deposit("token", tokenAmount);

                double usdtAmount = tokenAmount * price;
                wal.deposit("usdt", usdtAmount);
                pool.withdraw("usdt", usdtAmount);
            }
            else {
                double transferAmount = main.get("token") / 5;
                wal.deposit("token", transferAmount);
                main.withdraw("token", transferAmount);
                continue;
            }
        }

        cout << endl;
    }

    return 0;
}
c++ class
1个回答
0
投票
vector<Wallet> wallets = { w1, w2, w3, w4, w5 };
vector<Wallet> allWallets = { main, w1, w2, w3, w4, w5, pool };

这是你的问题,你正在堆栈上构造一组钱包,然后将它们复制到向量中。因为这些是钱包的向量,而不是对原始钱包的引用。因此,我们为每个人制作了一份副本。

然后您更新钱包中的钱包,但打印所有钱包中的数据,其中还包含原始数据的副本。

您可以通过存储钱包指针(然后必须管理原始指针,以便它们在仍在使用时不会被删除)或使用智能指针(例如unique_ptr)来解决此问题。

C++ 中的所有对象都被视为类型,就像一个大整型,因此具有与原始类型相同的语义。因此,您可以在堆栈或堆上创建它们,这与许多其他语言不同,这些语言将对象视为仅堆对象,并为您提供一个引用作为您使用的变量,默默地管理到原始对象的链接。 C++ 更好,它可以满足您的要求。

© www.soinside.com 2019 - 2024. All rights reserved.