不确定我做错了什么,希望有人能指出我正确的方向。我创建了一个客户类但我无法对其进行初始化。
customer.h
#ifndef CUSTOMER_H
#define CUSTOMER_H
#include "defs.h"
#include <string>
using namespace std;
class Customer
{
public:
Customer(string fName, string lName);
string getFirstName();
string getLastName();
int getCustID();
int getNumAccounts();
protected:
string firstName;
string lastName;
int custID;
int numAccounts;
};
#endif
customer.cc
#include "defs.h"
#include "Customer.h"
int Customer::nextCustID = 9001;
void Customer(){
//nothing;
}
void Customer::Customer(int test, int tes2)
{
custID = 100;
firstName = "George";
lastName = "sadfsad";
numAccounts = 0;
}
void Customer::Customer(string fName, string lName)
{
custID = nextCustID++;
string firstName = fName;
string lastName = lName;
numAccounts = 0;
}
int Customer::getCustID() { return custID; }
string Customer::getFirstName() { return firstName; }
string Customer::getLastName() { return lastName; }
int Customer::getNumAccounts() { return custID; }
我正在尝试使用
初始化客户Customer test("Billy", "Bob");
但是当我尝试初始化时,我得到了错误
BankControl.cc:(.text+0xaf): undefined reference to `Customer::Customer(std::string, std::string)'
collect2: error: ld returned 1 exit status
我无法弄清楚我做错了什么,如果有人有一些意见,那就太好了。非常感谢。
Bankcontrol.cc
#include "BankControl.h"
#include "Account.h"
#include "Customer.h"
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include "View.h"
BankControl::BankControl()
{
Customer test("Joe", "Billy");
}
答案 0 :(得分:1)
void Customer::Customer(string fName, string lName)
{
custID = nextCustID++;
string firstName = fName;
string lastName = lName;
numAccounts = 0;
}
构造函数不是void函数。所以,删除&#34; void&#34;。此外,您可能希望初始化变量而不是分配变量。
Customer::Customer(string fName, string lName) : firstName(fName), ....
抱歉,我没有做更多,但没有defs.h,这很难。希望这会有所帮助。
答案 1 :(得分:0)
既然你问你做错了什么,这里有一些我已经确定的问题。
<强>&#34;的defs.h&#34;不需要。
除了由Customer
定义的std::string
之外,班级<string>
看起来是自包含的。
在标题中使用命名空间std
不是个好主意。这意味着将为包含此标头的每个源文件包含(打开)std
命名空间。
通过常量引用传递常量变量
你的方法没有修改它们的字符串参数,所以通过常量引用传递它们:
Customer(const std::string& fName, const std::string& lName)
该引用将允许编译器生成直接访问变量的代码,而不是传递副本。有时制作大型变量的副本需要时间和额外的空间。
缺少标识符:nextCustId
这一行:
int Customer::nextCustID = 9001;
表示nextCustID
是类Customer
的成员,但数据成员不存在于您最初发布的类声明中。
构造函数没有返回类型 不要指定构造函数的返回类型,它们是不需要指定返回类型的特殊函数。
构造函数不使用参数
构造函数
Customer(int test, tes2)
不使用其参数。
答案 2 :(得分:0)
您正在编译和链接一个文件Bankcontrol.cc
。因此,链接器无法找到文件Customer
中定义的类customer.cc
的ctor。您需要配置IDE或构建系统来编译和链接项目的所有源文件,然后在修复所有文件的编译错误后,它应该可以工作。
详情可在此处找到:
What is an undefined reference/unresolved external symbol error and how do I fix it?
How to link multiple implementation files in C
关于C-C ++编译和链接的最后一个主题以相同的方式工作。
答案 3 :(得分:-1)
忘记将Customer.o放入我的makefile中。这解决了一切。