20

単純なクラス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の使用」とインクルードの方法を試してみましたが、これらのエラーを解消する方法がわかりません。それらの原因は何ですか?

4

2 に答える 2

33

はコンパイル できるはずですが、メイン プログラムがなければリンクlist.cppできません。(これは少し単純化しすぎている可能性があります。)

ソース ファイルをリンクせずにコンパイルする方法は、使用しているコンパイラによって異なります。を使用している場合g++、コマンドは次のようになります。

g++ -c list.cpp

これにより、クラスのマシン コードを含むオブジェクト ファイルが生成されます。コンパイラと OS によっては、list.oまたはと呼ばれる場合がありますlist.obj

代わりに試してみると:

g++ list.cpp

関数が定義されていると想定してmain実行可能ファイルを生成しようとすると、見たようなエラーが発生します (関数を定義していないmainため)。

もちろん、ある時点で、クラスを使用するプログラムが必要になります。そのためには、と関数を含む別の.cppソース ファイルが必要です。そのソース ファイルをコンパイルし、結果のオブジェクトをから生成されたオブジェクトとリンクして、動作する実行可能ファイルを生成できます。を使用すると、次のように 1 つのステップでそれを行うことができます。#include "list.h"main()list.cppg++

g++ list.cpp main.cpp -o main

mainどこかに機能が必要です。必ずしも入っている必要はありませんlist.cpp。また、スタイルとコード構成の問題として、おそらくlist.cpp. そのクラスを複数のメイン プログラムから使用できるようにしたい場合があります。

于 2013-01-31T07:30:39.943 に答える
14

main() への未定義の参照は、すべての C++ プログラムに必須の main() 関数がプログラムにないことを意味します。これをどこかに追加してください:

int main()
{
  return 0;
}
于 2013-01-31T07:29:24.487 に答える