C++ 未定义的引用
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5293021/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Undefined Reference to
提问by tpar44
When I compile my code for a linked list, I get a bunch of undefined reference errors. The code is below. I have been compiling with both of these statements:
当我为链表编译代码时,我收到一堆未定义的引用错误。代码如下。我一直在编译这两个语句:
g++ test.cpp
as well as
也
g++ LinearNode.h LinearNode.cpp LinkedList.h LinkedList.cpp test.cpp
I really do not understand why I am getting these errors because I am really rusty on classes in C++. I could really use some help.
我真的不明白为什么我会收到这些错误,因为我对 C++ 中的类真的很生疏。我真的可以使用一些帮助。
LinearNode.h:
线性节点.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:
线性节点.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:
链表.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:
链表.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:
测试.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);
}
采纳答案by Mahesh
- Usually headers guards are for header files (i.e.,
.h
) not for source files ( i.e.,.cpp
). - Include the necessary standard headers and namespaces in source files.
- 通常头文件保护是针对头文件(即,
.h
)而不是源文件(即,.cpp
)。 - 在源文件中包含必要的标准头文件和命名空间。
LinearNode.h:
线性节点.h:
#ifndef LINEARNODE_H
#define LINEARNODE_H
class LinearNode
{
// .....
};
#endif
LinearNode.cpp:
线性节点.cpp:
#include "LinearNode.h"
#include <iostream>
using namespace std;
// And now the definitions
LinkedList.h:
链表.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 source file is fine. Note that header files are never compiled. Assuming all the files are in a single folder -
test.cpp是源文件很好。请注意,头文件永远不会被编译。假设所有文件都在一个文件夹中 -
g++ LinearNode.cpp LinkedList.cpp test.cpp -o exe.out
回答by karlphillip
g++ test.cpp LinearNode.cpp LinkedList.cpp -o test
回答by Alexander Taylor
Another way to get this error is by accidentally writing the definition of something in an anonymous namespace:
获得此错误的另一种方法是意外地在匿名命名空间中编写某些内容的定义:
foo.h:
foo.h:
namespace foo {
void bar();
}
foo.cc:
foo.cc:
namespace foo {
namespace { // wrong
void bar() { cout << "hello"; };
}
}
other.cc file:
其他.cc文件:
#include "foo.h"
void baz() {
foo::bar();
}
回答by MUKESH KUMAR BADIGINENI
Try to remove the constructor and destructors, it's working for me....
尝试删除构造函数和析构函数,它对我有用....
回答by Deepak Sharma
I was getting this error because my cpp files was not added in the CMakeLists.txt file
我收到此错误是因为我的 cpp 文件未添加到 CMakeLists.txt 文件中