我如何将论点正确地传递给构造函数
How do I properly pass arguments over to the constructor?
我正在初学者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()
功能中,您声明了不需要的三个变量:name
,accountNumber
,socialSecurityNumber
。
- 如何正确地将带有指针的数组传递给函数
- 复制构造函数C++无法正确复制指针
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 在运行时有条件地删除类成员或跳过调用该成员对象的构造函数
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 使类在使用时调用正确的构造函数
- 你能在类和构造函数中初始化吗,这是否正确?
- C++:如何正确地将 deque::front() 返回的变量从函数中传递出去?
- 如何调用模板类型的正确构造函数?
- 如何正确实现具有原始指针的类的复制构造函数?
- C++递归地在类构造函数中创建对象
- 通过构造函数错误地播种梅森扭曲
- 我如何将论点正确地传递给构造函数
- 这些构造函数正确
- 这个构造函数正确
- 如何正确地从运算符构造函数内部调用复制构造函数
- 如何使用move构造函数正确处理shared_ptr的映射
- 如何正确地委托构造函数
- 自动(和不正确地)使用隐式构造函数