Возникли проблемы при инициализации объекта в 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++ работает одинаково.

Забыл поместить Customer.o в мой make-файл. Это решило все.

Другие вопросы по тегам