我正在处理一个简单的类List,但是在编译头文件和cpp文件时,我得到错误:对'main'的未定义引用
我做错了什么,我怎么能解决这个问题呢?
这是list.h文件,它有简单的标题:
list.h
#ifndef LIST_H
#define LIST_H
#include <string>
const int DEFAULT_CAPACITY = 100;
class List
{
public:
List();
List(int capacity);
~List();
void push_back(std::string s);
int size() const;
std::string at(int index) const;
private:
std::string* mData;
int mSize;
int mCapacity;
};
#endif
这是list.cpp文件:
list.cpp
#include "list.h"
#include <string>
List::List(){
mData = new std::string[DEFAULT_CAPACITY];
mSize = 0;
mCapacity = 100;
};
List::List(int capacity){
mData = new std::string[capacity];
mSize = 0;
mCapacity = capacity;
};
List::~List(){
delete[] mData;
};
void List::push_back(std::string s){
if (mSize<mCapacity){
mData[mSize] = s;
mSize++;
}
};
int List::size() const{
return mSize;
};
std::string List::at(int index) const{
return mData[index];
};
我尝试了“使用命名空间std”以及如何包含,但我无法弄清楚如何让这些错误消失。是什么导致了他们?
答案 0 :(得分:16)
你应该能够编译 list.cpp
,除非你有一个主程序,否则你不能链接它。 (这可能只是略微过于简单化了。)
编译源文件而不链接它的方法取决于您使用的编译器。如果您使用g++
,则命令为:
g++ -c list.cpp
这将生成一个包含您的类的机器代码的目标文件。根据您的编译器和操作系统,它可能被称为list.o
或list.obj
。
如果您改为尝试:
g++ list.cpp
它会假设您已经定义了main
函数并尝试生成可执行文件,从而导致您看到的错误(因为您没有定义了{{ 1}}功能)。
当然,在某些时候,您需要一个使用您班级的程序。为此,您需要另一个main
源文件,该文件具有.cpp
和#include "list.h"
功能。您可以编译该源文件,并将生成的对象与从main()
生成的对象链接在一起,以生成可用的可执行文件。使用list.cpp
,您可以一步完成,例如:
g++
你必须在某个地方拥有g++ list.cpp main.cpp -o main
功能。它不一定必须在main
中。作为风格和代码组织的问题,它可能不应该在list.cpp
;您可能希望能够从多个主程序中使用该类。
答案 1 :(得分:10)
对main()的未定义引用意味着您的程序缺少main()函数,这对所有C ++程序都是必需的。在某处添加:
int main()
{
return 0;
}