Ongedefinieerde referentiefout in c++

Ik krijg een ongedefinieerde verwijzing voor een van de klassenmethoden in c++. De fout is “ongedefinieerde verwijzing naar ‘Department::getNameabi:cxx11’ en andere vele regels voor elke methodeaanroep van afdeling.

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <vector>
#include "department.h"
using namespace std;
void addDepartment();
void writeToFile();
void showArt();
void removeDepartment();
vector <Department> departments;
int main()
{
    int choice;
    do
    {
        cout<<"1)Add asset \t 2)Remove Asset \t 3)Departmental Options \t 4)Quit"<<endl;
        cin>>choice;
        switch( choice )
        {
            case 1: addDepartment();
                    break;
            case 2: removeDepartment();
                    break;
            case 3: //showReport();
                    break;
        }
        addDepartment();
    }while(choice != 4);
}
void showArt()
{
    cout<<"ASSET MANGEMENT"<<endl;
}
void addDepartment()
{
    string name;
    cout<<"Ener department name"<<endl;
    cin>>name;
    vector<Department>::iterator it;
    int flag = 0;
    for( it = departments.begin(); it!=departments.end(); it++)
    {
        if (it->getName().compare(name) == 0)
        {
            flag = 1;
            it->addAsset();
            break;
        }
    }
    if (flag == 0 )
    {
        Department temp(name);
        temp.addAsset();
        departments.push_back(temp);
    }
}
void removeDepartment()
{
  string name;
    cout<<"Ener department name"<<endl;
    cin>>name;
    vector<Department>::iterator it;
    int flag = 0;
    for( it = departments.begin(); it!=departments.end(); it++)
    {
        if (it->getName().compare(name) == 0)
        {
            flag = 1;
            it->removeAsset();
            break;
        }
    }
    if (flag == 0 )
    {
        cout<<"No such department puta!"<<endl;
    }
}

Mijn afdelingen Header-bestand is als volgt:

#ifndef DEPARTMENT_H
#define DEPARTMENT_H
#endif
#include <cstring>
#include <vector>
#include <string>
#include "computer.h"
#include "software.h"
using namespace std;
class Department
{
    string name;
    vector<Computer> computers;
    vector <Software> softwares;
    void addComputer();
    void addSoftware();
    public:
    Department(string);
    void addAsset();
    void removeAsset();
    string getName();
};

FOUT

bipgen@genbox:~/asset-management$ g++ -std=c++11 main.cpp
/tmp/ccvu6doW.o: In function `addDepartment()':
main.cpp:(.text+0x181): undefined reference to `Department::getName[abi:cxx11]()'
main.cpp:(.text+0x1cd): undefined reference to `Department::addAsset()'
main.cpp:(.text+0x220): undefined reference to `Department::Department(std::__cxx11::basic_string<char, std::char_traits<char>, std::a
llocator<char> >)'
main.cpp:(.text+0x23b): undefined reference to `Department::addAsset()'
/tmp/ccvu6doW.o: In function `removeDepartment()':
main.cpp:(.text+0x392): undefined reference to `Department::getName[abi:cxx11]()'
main.cpp:(.text+0x3d8): undefined reference to `Department::removeAsset()'
collect2: error: ld returned 1 exit status

Antwoord 1, Autoriteit 100%

Alle ledenfuncties van Departmentworden alleen gedeclareerd, niet gedefinieerd.

Dit betekent dat de compiler hun bestaan bevestigt en main.cppcompileert, waar ze worden aangeroepen, zonder enige moeite.

Als de compiler zijn werk heeft gedaan, is het de beurt aan de linkerom de implementaties van de functies aan hun aanroepen te “lijmen”. Maar het vindt de implementaties niet, dus het klaagt terecht.


Ik denk dat je niet alleen de lidfuncties hebt aangegeven en bent vergeten ze te definiëren. U hebt zeer waarschijnlijk de definities in een apart bestand met de naam department.cppdat er als volgt uitziet:

#include "department.h"
void Department::addSoftware() {
    // implementation
}
Department::Department(string) {
    // implementation
}
void Department::addAsset() {
    // implementation
}
void Department::removeAsset() {
    // implementation
}
string Department::getName() {
    // implementation
}

U dacht waarschijnlijk ook dat het opnemen van department.hdoor main.cppop de een of andere manier op magische wijze de code van department.cppzou binnenhalen. .

Maar zo werkt C++ (of een typische C++-toolketen trouwens) niet. De linker weet niets van implementaties die afkomstig zijn van broncode in andere bestanden, tenzij je het vertelt. In jouw geval weet zelfs de compiler er niet van.

Je moet department.cppcompileren en de resulterende binaire code doorgeven aan de linker. De snelle manier om dit te doen is:

g++ -std=c++11 main.cpp department.cpp

Vroeg of laat wil je een uitgebreider proces, waarbij elk *.cpp-bestand wordt gecompileerd tot een *.o-bestand en de *.o-bestanden worden vervolgens doorgegeven aan de linker, en dat alles gebeurt binnen een Makefile.


Antwoord 2

Is de implementatie van de afdelingsklasse opgenomen in compileren?

g++ -std=c++11 main.cpp department.cpp

Other episodes