4

編集:`vtableへのc++未定義の参照に関連

継承に関するプロジェクトを実行しようとしていますが、次のエラーが発生します。

/tmp/ccw1aT69.o: In function `main':
main.cpp:(.text+0x15): undefined reference to `Derived::Derived(int)'
/tmp/ccw1aT69.o: In function `Derived::~Derived()':
main.cpp:(.text._ZN20DerivedD2Ev[_ZN20DerivedD5Ev]+0x13): undefined reference to `vtable for Derived'
main.cpp:(.text._ZN20DerivedD2Ev[_ZN20DerivedD5Ev]+0x1f): undefined reference to `Base::~Base()'
collect2: ld returned 1 exit status

これは私のコードです:

main.cpp:

#include <iostream>
#include "Base.h"
#include "Derived.h"

int main() {
    Derived intList(25);
}

base.h:

#ifndef BASE_H
#define BASE_H

class Base {
    public:
            ...
            Base (const Base& otherList);
            virtual ~Base();
    protected:
            int *list;
            int length;
            int maxSize;
};

#endif

Base.cpp:

#include "Base.h"
#include <iostream>

using namespace std;

...definitions of my members...

Base::Base (int size) {
//stuff
}
Base::~Base() {
    delete [] list;
}
Base::Base (const Base& otherList) {
//stuff
}

Derived.h:

#ifndef DERIVED_H
#define DERIVED_H
#include "Base.h"

class Derived: public Base {
    public:
             ...
            Derived (int size = 100);
            ~Derived(); //THIS LINE ADDED AFTER FIRST ANSWER
};

#endif

Derived.cpp:

#include "Derived.h"
#include <iostream>

using namespace std;

Derived::Derived (int size)
        :Base(size){
}

このエラーの原因は何ですか?コンストラクターを呼び出せないように見えますが、私には問題ないようです。

編集:私は最初の解決策を試しました。今すぐエラー:

/tmp/ccA4XA0B.o: In function `main':
main.cpp:(.text+0x15): undefined reference to `Derived::Derived(int)'
main.cpp:(.text+0x21): undefined reference to `Derived::~Derived()'
collect2: ld returned 1 exit status
4

3 に答える 3

7

で仮想デストラクタを宣言しましたがBase、定義していません。終了すると呼び出されるため、(純粋仮想関数ではないためDerived、同様に)で定義する必要があります。あなたが持っている必要があります:Basemain

class Base {
public:
    // ...
    virtual ~Base();
};

Base::~Base() {}

class Derived : public Base {
public:
    // ...
    ~Derived();
};

Derived::~Derived() { /* whatever */ }

それが、少なくとも 1 つのエラーの原因です。これがニシンかどうかはわかりませんが、次のようです。

/tmp/ccw1aT69.o: 関数内main': main.cpp:(.text+0x15): undefined reference toDerived::Derived(int)'

を定義Derived::Derived(int)しているので、それが実際のエラーであるとは考えにくいです。デストラクタを定義し、それが消えるかどうかを確認してください。

于 2012-09-07T22:46:32.130 に答える
3

わかりやすくするために、書式設定されたコードを回答以外に入れることはできないためです。基本クラスに仮想 dtor または純粋なメソッドがあるという理由だけで、派生クラスにデストラクタを提供する必要はありません。以下は、3 つの異なる構成/破棄条件でこれを示すことができるのと同じくらい簡単です。出力はコードの後に​​リストされます。これが少なくとも@Jeffに役立つことを願っています。私はこれを VS2005/2008/2010 と古い gcc 4.1.2 でテストしたので、正しいはずです。

#include <iostream>

class Base {
public:
    Base()
        { std::cout << "Base()" << std::endl; };

    virtual void call_me() = 0;

    virtual ~Base()
        { std::cout << "~Base()" << std::endl << std::endl; };
};

class Derived : public Base {
public:
    Derived(int i=1)
        { std::cout << "Derived(" << i << ")" << std::endl; }

    // Base::call_me requirements.
    void call_me() 
        { std::cout << "call_me()" << std::endl; }
};

int main(int argc, char* argv[])
{
    // use derived class pointer type
    Derived* pDerived = new Derived();
    pDerived->call_me();
    delete pDerived;

    // use base class pointer type
    Base* pBase = new Derived(2);
    pBase->call_me();
    delete pBase;

    // scope based
    {
        Derived obj(3);
        obj.call_me();
    }
    return 0;
}

この出力は次のとおりです。

Base()
Derived(1)
call_me()
~Base()

Base()
Derived(2)
call_me()
~Base()

Base()
Derived(3)
call_me()
~Base()
于 2012-09-08T00:26:40.533 に答える
0
main.cpp:(.text+0x15): undefined reference to `Derived::Derived(int)'

このエラー メッセージは、タイトルの質問にあるように、クラスへの未定義の参照を示しているわけではありません。むしろ、int パラメーターを取るコンストラクターへの未定義の参照について不平を言っています。あなたのコードをざっと見てみると、このコンストラクターは宣言されているだけで、定義されていません。.cpp ファイルに定義を追加すると、このエラーを解決する必要があります。

また、すべてのメンバー関数宣言の前にコンストラクター宣言を配置するのが一般的です。最初、私はこれらの宣言を見逃していました。ここで質問する際の誤解を避けるために、これを行うことを強くお勧めします。

于 2012-09-07T23:46:34.263 に答える