如何创建复制构造函数并将构造函数用作函数参数

时间:2017-04-04 14:10:01

标签: c++

一开始我想为这个主题的标题道歉。我不确定,所以我会解释我想要实现的目标。 让我们开始吧:))

我的代码:

 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()函数的输入。

提前谢谢。

1 个答案:

答案 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;
}

最后提示:在创建每个新交易时,不要忘记调整所涉及账户的余额!