C++错误:对`main'的未定义引用

smi*_*ham 11 c++

我正在编写一个简单的类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
Run Code Online (Sandbox Code Playgroud)

这是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];
};
Run Code Online (Sandbox Code Playgroud)

我试着尝试"使用命名空间std"以及如何包含,但我无法弄清楚如何让这些错误消失.是什么导致他们?

Kei*_*son 20

您应该能够编译 list.cpp,除非您有主程序,否则无法链接它.(这可能只是略微过于简单化了.)

编译源文件而不链接它的方法取决于您使用的编译器.如果你正在使用g++,命令将是:

g++ -c list.cpp
Run Code Online (Sandbox Code Playgroud)

这将生成一个包含您的类的机器代码的目标文件.根据您的编译器和操作系统,可能会调用它list.olist.obj.

如果您改为尝试:

g++ list.cpp
Run Code Online (Sandbox Code Playgroud)

它将假定您已定义一个main函数并尝试生成可执行文件,从而导致您看到的错误(因为您尚未定义main函数).

当然,在某些时候,你需要一个使用你的班级的程序.为此,您需要另一个.cpp具有a #include "list.h"main()函数的源文件.您可以编译该源文件,并将生成的对象与生成的对象链接在一起,list.cpp以生成可用的可执行文件.有了g++,您可以一步完成,例如:

g++ list.cpp main.cpp -o main
Run Code Online (Sandbox Code Playgroud)

你必须在main某个地方有一个功能.它不一定必须在list.cpp.作为风格和代码组织的问题,它可能不应该存在list.cpp; 您可能希望能够从多个主程序中使用该类.


Lun*_*din 10

对main()的未定义引用意味着您的程序缺少main()函数,这对所有C++程序都是必需的.在某处添加:

int main()
{
  return 0;
}
Run Code Online (Sandbox Code Playgroud)