Возникли проблемы при инициализации объекта в C++ - Linux
Не уверен, что я делаю неправильно, надеялся, что кто-то может указать мне правильное направление. Я создал класс клиента, но не могу его инициализировать.
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");
}
4 ответа
void Customer::Customer(string fName, string lName)
{
custID = nextCustID++;
string firstName = fName;
string lastName = lName;
numAccounts = 0;
}
Конструктор не является пустой функцией. Итак, удалите "пустоту". Кроме того, вы, вероятно, хотите инициализировать переменные, а не назначать их.
Customer::Customer(string fName, string lName) : firstName(fName), ....
Извините, я не сделал больше, но без defs.h это сложно. Надеюсь это поможет.
Так как вы спросили, что вы делаете неправильно, вот некоторые проблемы, которые я определил.
"defs.h" не требуется.
Класс 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)
не использует его параметры.
Вы компилируете и связываете только один файл Bankcontrol.cc
, Так что компоновщик не может найти ctor для класса Customer
который определен в файле customer.cc
, Вам необходимо настроить IDE или систему сборки для компиляции и компоновки всех исходных файлов для вашего проекта, а затем, после исправления ошибок компиляции для всех файлов, он должен работать.
Подробности можно найти здесь:
Что такое неопределенная ссылка / неразрешенная внешняя ошибка символа и как ее исправить?
Как связать несколько файлов реализации в C
Последний раздел о компиляции и компоновке C - C++ работает одинаково.