2016-09-29 5 views
-1

Nicht sicher, was ich falsch mache, hoffte, dass jemand mich in die richtige Richtung zeigen kann. Ich habe eine Kundenklasse erstellt, kann sie aber nicht initialisieren.Probleme beim Initialisieren eines Objekts in 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; } 

Ich versuche, den Kunden mit

Customer test("Billy", "Bob"); 

zu initialisieren Aber dann bekomme ich die Fehlermeldung, wenn ich versuche zu initialisieren

BankControl.cc:(.text+0xaf): undefined reference to `Customer::Customer(std::string, std::string)' 
collect2: error: ld returned 1 exit status 

Ich kann nicht herausfinden, was ich falsch mache, wenn jemand etwas Input hat, das wäre toll. Vielen Dank im Voraus.

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

Was verwenden Sie von "defs.h"? –

+0

Die Fehlermeldung besagt, dass der Fehler in bankcontrol.cc auftritt - bitte fügen Sie diesen Code zu Ihrer Frage hinzu – EkcenierK

+0

Obwohl nicht * falsch *, ist es eine gute Praxis, nicht 'using namespace std' in einer Header-Datei zu verwenden. –

Antwort

1
void Customer::Customer(string fName, string lName) 
{ 
    custID = nextCustID++; 
    string firstName = fName; 
    string lastName = lName; 
    numAccounts = 0; 
} 

Der Konstruktor ist keine Leere Funktion. Also, entferne die "Leere". Wahrscheinlich möchten Sie auch Variablen initialisieren und nicht zuweisen.

Customer::Customer(string fName, string lName) : firstName(fName), .... 

Sorry, ich habe nicht mehr gemacht, aber ohne defs.h, es ist schwierig. Hoffe das hilft.

+0

Es wurde nichts von def.h mehr verwendet, so dass ich es vollständig entfernt. – user1730056

+0

Beachten Sie, dass Sie mit C++ 11 Variablen tatsächlich mit Standardwerten in der Header-Datei initialisieren können. Das würde es ermöglichen, "int nextCustID = 9001;" im Header und nicht in der '.cc' Datei zu setzen. – Jvinniec

+0

Er sollte auch 'Customer();' und 'Customer (int test, int tes2);' zu seiner Header-Datei hinzufügen sowie den Standardkonstruktor in seiner '.cc' Datei von' void Customer() 'in' ändern Kunde :: Kunde() '. – Jvinniec

0

Da Sie gefragt haben, was Sie falsch machen, hier sind einige Probleme, die ich identifiziert habe.

"defs.h" nicht benötigt.
Die Klasse Customer sieht unabhängig von der std::string aus, die durch <string> definiert ist.

Verwendung von Namespace Std in Header
Keine gute Idee. Dies bedeutet, dass der Namespace std für jede Quellendatei, die diesen Header enthält, eingeschlossen (geöffnet) wird.

Pass konstanten Variablen, die durch konstante Referenz
Ihre Methoden nicht modifizieren, damit ihre String werden Parameter sie durch konstante einen Verweis:

Customer(const std::string& fName, const std::string& lName) 

Der Referenz der Compiler Code erzeugen ermöglichen, die direkt die Variablen zugreift anstatt Kopien zu übergeben. Manchmal erfordert das Erstellen von Kopien großer Variablen Zeit und zusätzlichen Speicherplatz.

Fehlende Kennung: nextCustId
Die Linie:

int Customer::nextCustID = 9001; 

sagt, dass nextCustID ein Mitglied der Klasse ist Customer, aber das Datenelement existiert nicht in der Klassendeklaration, die Sie ursprünglich gebucht.

Konstrukteurs haben keine Rückgabetypen Sie die Rückgabetypen für Konstrukteure nicht angeben, sie sind spezielle Funktionen, die einen festgelegten Rückgabetyp nicht benötigen.

Constructor verwendet keine Parameter
Der Konstruktor

Customer(int test, tes2) 

nicht seine Parameter verwenden.

+0

Ich würde auch darauf hinweisen, dass 'Customer.h' die Deklarationen von' Customer() 'und' Customer (int test, int test2) fehlt. ' – Jvinniec

0

Sie kompilieren und verknüpfen nur eine Datei Bankcontrol.cc. Daher kann der Linker ctor für die Klasse Customer, die in der Datei customer.cc definiert ist, nicht finden. Sie müssen Ihre IDE konfigurieren oder ein System erstellen, um alle Quelldateien für Ihr Projekt zu kompilieren und zu verknüpfen, und dann, nachdem Sie Kompilierungsfehler für alle Dateien behoben haben, sollte es funktionieren.

Details finden Sie hier:

What is an undefined reference/unresolved external symbol error and how do I fix it?

How to link multiple implementation files in C

Thow letztes Thema über C - C++ Erstellung und Verknüpfung die gleiche Art und Weise arbeiten.

+0

Auch wenn Sie die entsprechende Verknüpfung von customer.h und customer.cc enthalten Dateien, der Fragesteller wird immer noch das gleiche Problem haben. Ich denke, die anderen Antworten sind näher am eigentlichen Problem. – Jvinniec

+0

@Jvinniec laut OPs eigener Antwort war meine trotz Zweifel am nächsten. – Slava

+0

Weil 'void Customer :: Customer (Zeichenfolge fName, Zeichenfolge lName)' keine gültige Methode zum Definieren eines Konstruktors ist. Zumindest scheint sich GCC darüber zu beschweren. – Jvinniec

-1

Ich habe vergessen, Customer.o in mein Makefile zu legen. Das hat alles gelöst.

+2

Da diese Antwort und Frage auch keinen Wert für andere Personen hat, möchten Sie vielleicht Ihre Frage entfernen. – Slava

Verwandte Themen