我正在使用初学者级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作为帐号),却不给我任何社会保险号。我不确定为什么它没有显示正确的数据。
无论如何,我将不胜感激。
答案 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()
函数中,您声明了三个不需要的变量:name
,accountNumber
,socialSecurityNumber
。