我正在尝试开发一个出于实用目的的交易模拟。 在代码末尾,我看到对象内的值已更改,但当它返回时,它会继续使用初始数据。我不明白我的错误在哪里。谢谢。
逻辑非常简单:向卖家提供代币并收到 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;
}
vector<Wallet> wallets = { w1, w2, w3, w4, w5 };
vector<Wallet> allWallets = { main, w1, w2, w3, w4, w5, pool };
这是你的问题,你正在堆栈上构造一组钱包,然后将它们复制到向量中。因为这些是钱包的向量,而不是对原始钱包的引用。因此,我们为每个人制作了一份副本。
然后您更新钱包中的钱包,但打印所有钱包中的数据,其中还包含原始数据的副本。
您可以通过存储钱包指针(然后必须管理原始指针,以便它们在仍在使用时不会被删除)或使用智能指针(例如unique_ptr)来解决此问题。
C++ 中的所有对象都被视为类型,就像一个大整型,因此具有与原始类型相同的语义。因此,您可以在堆栈或堆上创建它们,这与许多其他语言不同,这些语言将对象视为仅堆对象,并为您提供一个引用作为您使用的变量,默默地管理到原始对象的链接。 C++ 更好,它可以满足您的要求。