一开始我想为这个主题的标题道歉。我不确定,所以我会解释我想要实现的目标。 让我们开始吧:))
我的代码:
class CCompany
{
public:
CCompany(void); // Default constructor
CCompany(const CCompany & b); // Copy constructor
bool NewAccount(const char * AccountID, int initialBalance);
bool NewTranscation(const char * AccountID_SendFrom, const char * AccountID_SendTo, amount);
CCompany ShowAllTransactions(const char * AccountID); // Function that shows all the transactions of the selected account
int Balance(); // Shows actual account
...
...
...
private:
struct Transcaction
{
char AccountID[100];
int InitialBalance;
int ActualAccount;
int *transactionAmount;
int transactionCounter;
};
Transcaction Transcactions[10000];
}
int main ( void )
{
CCompany c0;
assert(c0.NewAccount( "11111", 200 ));
assert(c0.NewAccount("66666", -600 ));
assert(c0.NewTranscation( "66666", "11111", 1000 ) ); // After this transaction>>> 11111: 1200, 66666: -1600
assert(c0.Account( "66666" ).Balance() == -1600 );
}
首先,我想说我们不能使用STL,也不能使用字符串,因此无法使用向量或其他STL容器。我选择struct array来完成任务。如果您有更好的建议,请告诉我。另外,我们不能使用字符串,而是使用char数组。也许是因为学习了如何正确分配内存,复制char数组..
无论如何,我想问两个问题:
1)如何为这个类创建一个拷贝构造函数
2)我不确定这个"断言(x0。帐户(" 32322")。Balance()== -1600);" 如何创建一个函数帐户哪个输出转到Balance()函数的输入。
提前谢谢。
答案 0 :(得分:0)
您似乎必须依赖静态分配:
Transcaction Transcactions[10000];
嗯,对您的帐户也一样:
Account accounts[1000];
您必须创建一个合适的帐户类,但它可能看起来类似于您的事务类,其中包含id和balance成员。您可能希望提供适当的构造函数以便于进一步使用它:
struct Account
{
char id[128];
int balance;
Account(char const* theId = nullptr, int balance = 0)
: balance(balance)
{
if(theId)
{
strncpy(id, theId, sizeof(id));
// just for the case of theId begin too long:
id[sizeof(id) - 1] = 0;
}
}
Account(Account const& other) = default;
};
进一步详细说明......请注意,您也会获得默认分配操作符。
但是,您的交易类对我来说似乎不合适。交易基本上需要源帐户,目标帐户和要转移的金额。 Id是可选的,但可能很有用。根据您的需要,可以使用指向相应帐户实例的指针或指向公司帐户数组的索引:
struct Transaction
{
unsigned int id;
unsigned int sourceAccountIndex; // alternative: pointer or id string
unsigned int destinationAccountIndex; // alternative: pointer or id string
int amount;
};
使用索引或指针,您可以更快地访问相关帐户,但是,如果您要再次删除帐户,则必须考虑指针/索引无效。这不是很难应付,如果你不想,你仍然可以像现在一样保留帐户ID(但你需要其中两个!)。
使用数组类成员,您可以免费获得复制构造函数!只需声明:
Company(Company const& other) = default;
如果您想要或必须显式编写复制构造函数,只需遍历数组并复制条目(通常,您更喜欢std :: copy,但是当STL被明确排除时......):
Company::Company(Company const& other)
{
for(unsigned int i = 0; i < sizeof(accounts)/sizeof(*accounts); ++i)
{
accounts[i] = other.accounts[i];
}
// transactions analogously
}
最后:您的帐户功能将遍历条目并返回ID匹配的第一个帐户:
Company::Account* Company::account(char const* id)
{
for(unsigned int i = 0; i < sizeof(accounts)/sizeof(*accounts); ++i)
{
if(strcmp(id, accounts[i].id) == 0)
{
return accounts + i;
}
}
return nullptr;
}
使用指针的变体(我个人更喜欢的那个):
Company::Account* Company::account(char const* id)
{
Account* end = accounts + sizeof(accounts)/sizeof(*accounts);
for(Account* a = accounts; a != end; ++a)
{
if(strcmp(id, a->id) == 0)
{
return a;
}
}
return nullptr;
}
最后提示:在创建每个新交易时,不要忘记调整所涉及账户的余额!