Ongedefinieerde verwijzing naar

Als ik mijn code compileer voor een gelinkte lijst, krijg ik een heleboel ongedefinieerde referentiefouten. De code staat hieronder. Ik heb deze beide verklaringen samengesteld:

g++ test.cpp 

evenals

g++ LinearNode.h LinearNode.cpp LinkedList.h LinkedList.cpp test.cpp  

Ik begrijp echt niet waarom ik deze fouten krijg, omdat ik echt roestig ben met klassen in C++. Ik kan echt wat hulp gebruiken.

LinearNode.h:

#ifndef LINEARNODE_H
#define LINEARNODE_H
#include<iostream>
using namespace std;
class LinearNode
{
    public:
        //Constructor for the LinearNode class that takes no arguments 
        LinearNode();
        //Constructor for the LinearNode class that takes the element as an argument
        LinearNode(int el);
        //returns the next node in the set.
        LinearNode* getNext();
        //returns the previous node in the set
        LinearNode* getPrevious();
        //sets the next element in the set
        void setNext(LinearNode* node);
        //sets the previous element in the set
        void setPrevious(LinearNode* node);
        //sets the element of the node
        void setElement(int el);
        //gets the element of the node
        int getElement();
    private: 
        LinearNode* next;
        LinearNode* previous;
        int element;        
};//ends the LinearNode class
#endif

LinearNode.cpp:

#ifndef LINEARNODE_cpp
#define LINEARNODE_cpp
#include<iostream>
#include"LinearNode.h"
using namespace std;
//Constructor for LinearNode, sets next and element to initialized states
LinearNode::LinearNode()
{
    next = NULL;
    element = 0;
}//ends LinearNode default constructor
//Constructor for LinearNode takes an element as argument.
LinearNode::LinearNode(int el)
{
    next = NULL;
    previous = NULL;
    element = 0;
}//ends LinearNode constructor
//returns the next element in the structure
LinearNode* LinearNode::getNext()
{
    return next;
}//ends getNext function
//returns previous element in structure
LinearNode* LinearNode::getPrevious()
{
    return previous;
}//ends getPrevious function
//sets the next variable for the node
void LinearNode::setNext(LinearNode* node)
{
    next = node;
}//ends the setNext function
//sets previous for the node
void LinearNode::setPrevious(LinearNode* node)
{
    previous = node;
}//ends the setPrevious function
//returns element of the node
int LinearNode::getElement()
{
    return element;
}//ends the getelement function
//sets the element of the node
void LinearNode::setElement(int el)
{
    element = el;
}//ends the setElement function
#endif

LinkedList.h:

#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include<iostream>
#include"LinearNode.h"
using namespace std;
class LinkedList
{
    public:
        LinkedList();
        void add(int element);
        int removie (int element);
    private:
        int count;
        LinearNode *contents;
};//ends the class linked list
#endif

LinkedList.cpp:

#ifndef LINKEDLIST_CPP
#define LINKEDLIST_CPP
#include<iostream>
#include"LinearNode.h"
#include"LinkedList.h"
using namespace std;
//linkedlist constructor for an empty linked list
LinkedList::LinkedList()
{
    count = 0;
    contents = NULL;
}//ends the constructor
//adds an element to the front of the linked list
void LinkedList::add(int element)
{
    int found = 0, current = 0;
    while( (found == 0) && (current !=count) )
    {
        if (contents.getElement() == element)
            found = 1;
        else    
        {
            contents = contents.getNext();
            current++;
        }//ends the else statement
    }//ends the while loop
    if (found == 0)
    {
        LinearNode node = new LinearNode(element);
        node.setNext(contents);
        contents.setPrevious(node);
        count++;
    }//ends the found == 0 if statment
}//ends the add function
//this function removes one element from the linked list.
int LinearNode::remove(int element)
{
    int found = 0;
    if (count == 0)
        cout << "The list is empty" << endl;
    else 
    {
        if (contents.getElement() == element)
        {
            result = contents.getElement();
            contents = contents.getNext();
        }//ends the contents.getElement() == element
        else 
        {
            previous = contents;
            current = contents.getNext();
            for (int index = 0; ( (index < count) && (found == 0) )index++)
                if (current.getElement() = element)
                    found = 1;
                else
                {
                    previous = current;
                    current = current.getNext();
                }//ends the else statement 
            if (found == 0)
                cout << "The element is not in the list" << endl;
            else
            {
                result = current.getElement();
                previous.setNext(current.getNext());
            }//ends else statement  
        }//ends the else stamtement
        count--;
    }//ends the else statement of count == 0
    return result;
}//ends the remove function
#endif

test.cpp:

#include<iostream>
#include"LinearNode.h"
#include"LinkedList.h"
using namespace std;
int main()
{
    LinearNode node1, node2, node3, move;
    LinkedList list;    
    node1.setElement(1);
    node2.setElement(2);
    node3.setElement(3);
}   

Antwoord 1, autoriteit 100%

  1. Meestal zijn header guards voor header-bestanden (d.w.z. .h) niet voor bronbestanden (d.w.z. .cpp).
  2. Neem de benodigde standaard headers en naamruimten op in bronbestanden.

LinearNode.h:

#ifndef LINEARNODE_H
#define LINEARNODE_H
class LinearNode
{
    // .....
};
#endif

LinearNode.cpp:

#include "LinearNode.h"
#include <iostream>
using namespace std;
// And now the definitions

LinkedList.h:

#ifndef LINKEDLIST_H
#define LINKEDLIST_H
class LinearNode; // Forward Declaration
class LinkedList
{
    // ...
};
#endif

LinkedList.cpp

#include "LinearNode.h"
#include "LinkedList.h"
#include <iostream>
using namespace std;
// Definitions

test.cppis het bronbestand is in orde. Merk op dat header-bestanden nooit worden gecompileerd. Ervan uitgaande dat alle bestanden zich in een enkele map bevinden –

g++ LinearNode.cpp LinkedList.cpp test.cpp -o exe.out

Antwoord 2, autoriteit 21%

g++ test.cpp LinearNode.cpp LinkedList.cpp -o test

Antwoord 3, autoriteit 12%

Ik kreeg deze foutmelding omdat mijn cpp-bestanden niet zijn toegevoegd aan het bestand CMakeLists.txt


Antwoord 4, autoriteit 8%

Een andere manier om deze fout te krijgen is door per ongeluk de definitie van iets in een anonieme naamruimte te schrijven:

foo.h:

namespace foo {
    void bar();
}

foo.cc:

namespace foo {
    namespace {  // wrong
        void bar() { cout << "hello"; };
    }
}

other.cc-bestand:

#include "foo.h"
void baz() {
    foo::bar();
}

Antwoord 5, autoriteit 4%

Ik had dit probleem toen ik vergat het nieuwe .h/.c-bestand dat ik had gemaakt toe te voegen aan het mesonrecept, dus dit is slechts een vriendelijke herinnering.


Antwoord 6

Probeer de constructor en destructors te verwijderen, het werkt voor mij….

Other episodes