如何正确地将参数传递给构造函数?

时间:2019-02-20 04:42:35

标签: c++

我正在使用初学者级C ++课程进行练习,但感觉有些卡住。

说明如下: 从教科书的图3.4中的Account类开始,向Account类中已经存在的名称数据成员添加两个额外的数据成员(accountNumber和socialSecurityNumber)。 accountNumber应为int类型,socialSecurityNumber应为字符串。您的类应该具有一个构造函数(带有3个参数),该构造函数使用这些参数来初始化3个数据成员。

为两个附加数据成员中的每个成员添加一个set函数,以将数据传递到数据成员中。此外,为每个数据成员提供一个get函数以检索其值。

编写类似于图3.5中的程序的测试(驱动程序)程序,该程序演示了Account类的功能,如下所示: -在创建每个对象时,通过将3个适当的参数传递给构造函数来创建3个Account对象。 -显示accountNumber,socialSecurityNumber的值以及3个Account对象中每个对象的名称。

似乎很简单。据我了解该练习,我们不必让用户输入姓名,帐号和ssn的数据。这只是硬编码。我想我已经很好地创建了类,但是在创建每个对象时将参数传递给构造函数会让我失望。希望得到一些帮助。

.h文件:

// Fig. 3.4: Account.h
// Account class with a constructor that initializes the account name.
#include <string>

class Account {
public:
   // constructor initializes data member name with parameter accountName
    Account(std::string accountName, std::string SSN, int accountNumber) 
     : name{accountName}   { // member initializer

    void setAccountNumber(int accountNumber);
}               

// why can't I place this here? What does the green underline mean?
//void setAccountNumber(int accountNumber);


        //set function to set the account name
void setName(std::string accountName) {
    name = accountName;
}
        //set function to set the SSN
void setSSN(std::string SSN) {
    socialSecurityNumber = SSN;
}


                //GET FUNCTIONS
    //get function to retrieve the account name
   std::string getName() const {
  return name; 
} 


    //get function for data member accountNumber
  int getAccountNumber() const {
   return accountNumber;
  }

  //get function for data member socialSecurityNumber
   std::string getSSN() const {
   return socialSecurityNumber;
}


private:
   std::string name; // account name data member
   int accountNumber; //account number data member
   std::string socialSecurityNumber; // social security number data member
}; 

.cpp文件:

// Fig. 3.5: AccountTest.cpp
// Using the Account constructor to initialize the name data
// member at the time each Account object is created.
#include <iostream>
#include "Account.h"

using namespace std;

int main() { 
//declaring data members
std::string name; // account name data member
int accountNumber; //account number data member
std::string socialSecurityNumber; // social security number data member

            // create three Account objects


   Account account2{"John Blue", 780909, "130099"}; 

   cout << "account2 name is: " << account2.getName();
   cout << "The account number for " << account2.getName() << " is " << 
account2.getAccountNumber();
   cout << "The social security number for " << account2.getName() << " is " << account2.getSSN();


   // the two lines needed so that my compiler doesn't immediately crash
   std::cin.ignore();
   std::cin.get();
 }

如果要从对象中取出“ 780909”和“ 130099”,以及显示这些数字的代码,则可以正常工作。它将很好地显示John Blue,但是当我尝试添加这两个数字系列以及随后显示这些数字的代码时,它将无法正常工作,我不确定为什么。另外,这些数字是任意的,实际上并不代表任何含义。它们可以是任何数字序列。

关于对象是Account account2,我在最左边的左括号下方显示一条红线,上面写着(const char [10])“ John Blue”没有构造函数“ Account :: account”的实例与参数列表匹配参数类型为:(const char [10],int,int)。我不确定这是否有帮助,但这就是我得到的编译错误。

EDIT2:我得到了它来吐出一些数据。它会正确吐出帐户持有人的姓名John Blue,然后给我一个完全错误的帐号编号(给我-858993460作为帐号),却不给我任何社会保险号。我不确定为什么它没有显示正确的数据。

无论如何,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

您尝试使用构造函数声明体内的函数

Account(std::string accountName, std::string SSN, int accountNumber) 
 : name{accountName}   { // member initializer

    void setAccountNumber(int accountNumber); // A declaration of a function
}               

您不应该在构造函数中使用setter,而应以与name相同的方式初始化其他数据成员。

Account(std::string name, int number, std::string SSN) 
  : name(name), number(number), SSN(SSN)
{} // No extra work needed here

// ...

std::string name; // account name data member
int number;       // account number data member
std::string SSN;  // social security number data member

如果没有其他约束,最好以与声明数据成员相同的顺序传递构造函数参数。它们将按照声明顺序进行初始化,而不是按照它们在初始化列表中出现的顺序进行初始化,因此,如果这些不同的人可能会感到困惑。

答案 1 :(得分:-1)

您快到了!您需要初始化构造函数中的所有数据成员(有两种方法可以初始化),并且需要以正确的顺序和正确的类型使用参数调用构造函数。

我不知道c ++对具有相同名称的类成员和局部函数变量有何反应,但是为了清楚/易读起见,我将使用不同的符号[NB:可以肯定的是,编码指南中建议使用其他符号;使用您想要或需要使用的任何东西,但无论如何都要保持可读性。

// Fig. 3.4: Account.h
// Account class with a constructor that initializes the account name.
#include <string>

class Account {
public:
   // constructor initializes data member name with parameter accountName, ...
    Account(std::string account_name, std::string ssn, int account_number) {

    setName(account_name);
    setAccountNumber(account_number);
    setSSN(ssn);
}               

void setAccountNumber(int account_number) {
     accountNumber = account_number;
}    

        //set function to set the account name
void setName(std::string account_name) {
    name = account_name;
}
        //set function to set the SSN
void setSSN(std::string ssn) {
    socialSecurityNumber = ssn;
}


                //GET FUNCTIONS
    //get function to retrieve the account name
   std::string getName() const {
  return name; 
} 


    //get function for data member accountNumber
  int getAccountNumber() const {
   return accountNumber;
  }

  //get function for data member socialSecurityNumber
   std::string getSSN() const {
   return socialSecurityNumber;
}


private:
   std::string name; // account name data member
   int accountNumber; //account number data member
   std::string socialSecurityNumber; // social security number data member
};

编写构造函数的另一种方法是:

Account(std::string account_name, std::string ssn, int account_number) 
  : name(account_name), socialSecurityNumber(ssn), accountNumber(account_number)
{
}       

最后,应将构造函数与按正确顺序出现的参数一起使用:

Account alice("Alice","123abc",4711);
Account bob("Bob","x39",1234);

main()函数中,您声明了三个不需要的变量:nameaccountNumbersocialSecurityNumber