我如何将论点正确地传递给构造函数

How do I properly pass arguments over to the constructor?

本文关键字:构造函数 正确地      更新时间:2023-10-16

我正在初学者C 课程中进行练习,我有点卡住。

指示如下:从教科书的图3.4中的帐户类开始,将两个附加数据成员(帐户名称和社交服务员)添加到帐户类中的名称数据成员中。帐户名称应为INT类型,而SocialSecurityNumber应该是字符串。您的类应具有使用参数初始化3个数据成员的构造函数(具有3个参数)。

为两个附加数据成员中的每个成员添加设置功能,以将数据传递到数据成员中。另外,为每个数据成员提供一个获取功能以检索其值。

编写与图3.5程序类似的测试(驱动程序)程序,该程序演示了类帐户的功能,如下所示: - 创建每个对象时,通过将3个适当的参数传递给构造函数来创建3个帐户对象。 - 显示帐户名的值,社交服务名称和3个帐户对象的每个名称。

似乎很简单。据我了解,我们不必将用户输入数据用于其名称,帐号和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"answers" 130099",以及显示这些数字的代码,则可以正常运行。它会显示约翰蓝,但是当我尝试添加这两个系列数字和代码时,以显示这些数字 - 它将不起作用,我不确定为什么。另外,这些数字是任意的,并不意味着什么。它们可能是任何系列数字。

至于对象是帐户2,我在最远的左支架下得到一条红线(const char [10])"约翰蓝色"没有构造函数" accountor :: account"的实例与参数列表匹配参数类型为:(const char [10],int,int)。我不确定这是否有帮助,但这是我遇到的汇编错误。

edit2:我已经吐出一些数据。它正确吐出了帐户持有人的名称,约翰·布鲁。我不确定为什么它不显示正确的数据。

无论如何,我都感谢所有帮助。

您对构造函数的尝试声明 一个函数

Account(std::string accountName, std::string SSN, int accountNumber) 
 : name{accountName}   { // member initializer
    void setAccountNumber(int accountNumber); // A declaration of a function
}               

您不应该将设置器涉及构造函数,而应以与name相同的方式进行INTIAL INIALIAL。

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

如果您没有其他约束,则最好以与数据成员的声明方式相同的顺序传递构造函数。它们将以声明顺序初始化,而不是它们出现在初始评估列表中的顺序,因此,如果这些不同的人可能会混淆。

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

我不知道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