2017-03-28 6 views
1

Ich bekomme immer Fehler: undefined reference to 'Company::budget'. Meine Methode ist so eingerichtet, dass sie den Wert des (beliebigen erstellten) Budgets des Unternehmens berücksichtigt und das Gehalt des Mitarbeiters von diesem subtrahiert. Ich bekomme dieses Problem immer wieder. Versuchte beide Zeiger und sagen wir "normales Anrufen". Ok, es ist der Code-Schnipsel: (Rest es funktioniert)C++ - undefinierter Verweis auf 'Class :: variable'

company.h

#include <iostream> 
#include <cstdlib> 
#include <list> 
#include <vector> 
#include "employee.h" 
using namespace std; 

class Company 
{ 
public: 
    Company* comp; 
    void hire(Employee& emp, float putSalary); 
    void fire(Employee& emp); 
    void endOfMonth(Company& comp); 
    Company(float); 
// static float moneyamount; 
private: 
    static float budget; 
    vector <Employee>* Employees; 
}; 

company.cpp

void Company::endOfMonth(Company& comp) 
{ 
    for (iterat=0; iterat < Employees->size() ; iterat++) 
    { 

     cout << (*Employees)[iterat].fullName << endl; 
     cout << (*Employees)[iterat].getSalary() << endl; 
     comp.budget = comp.budget - (*Employees)[iterat].getSalary(); 
    }  
} 
+0

http://stackoverflow.com/questions/12573816/what-is-an- undefined-referenz-nicht-gelöst-external-symbol-fehler-und-wie-tun-i-fix/12574407 # 12574407 – chris

+0

wenn es möglich ist, sollten Sie 'smart_pointers' verwenden und es ist auch keine großartige Idee, 'using' zu verwenden namespace std' – Matthew

Antwort

1

Sie sind die Definition der statischen Klassendatenelement fehlt. Fügen Sie der Datei company.cpp die folgende Zeile hinzu:

float Company::budget; 
+1

Vielen Dank, ich habe nicht bemerkt, dass – Lutrin

+1

Ich hätte gesagt 'nehmen Sie die statische aus'. Warum sollte das Budget eines Unternehmens statisch sein? Es beschränkt effektiv die App, nur eine Firma zu übergeben :(Außerdem müssen Sie sich an die lästige statische Defn/Initialisierer erinnern :( – ThingyWotsit

+1

Ja, ich stimme zu. Ein Unternehmen * hat * ein Budget. Es gehört zu dieser Firma. Alle Unternehmen nicht teilen Sie ein einzelnes Budget, was bedeutet, dass statische. Auch wenn es jetzt funktioniert, bedeutet die Beschränkung auf eins bedeutet mehr Arbeit später, wenn Sie sich entscheiden, die Verwendung des Codes zu erweitern. BTW der Grund für die separate statische Elementvariable ist, dass sie brauchen Irgendwo zugewiesen werden (alle Variablen müssen irgendwo in einem Modul vorhanden sein) und sie sind nicht Teil eines * einzigen * Objekts. –

1

Statische Klassenmembervariablen sind für alle Instanzen einer Klasse statisch. Wenn Sie also zwei Instanzen einer Klasse haben, teilen sie die statische Variable. Diese Variablen sind auch gültig, auch wenn keine Instanz der Klasse ist. Daher können statische Memberfunktionen statische Membervariablen verwenden. Aus diesem Grund müssen sie irgendwo außerhalb der Klasse in der Objektdatei definiert werden.

Sie es definieren und behalten den notwendigen Platz für sie auf der obersten Ebene in Erinnerung an Sie Datei .cpp:

float Company::budget; 
+1

Es scheint ein häufiges Problem in C++ zu sein, Entwickler scheinen zufällig 'statisch' zu tippen, In diesem Fall beschränkt es die App auf eine Firma, aber die Entwickler tun dies in Multithread- und anderen Umgebungen, wo es entweder einschränkend oder gefährlich ist :(. – ThingyWotsit

Verwandte Themen