0

別のアプリケーションで使用している共有ライブラリを作成しました。共有ライブラリのコア機能の 1 つは、リークされているオブジェクトをチェックする基本クラスです。

ライブラリ内のコードは次のとおりです。

// LeakCheck.hpp
#include <vector>
class LeakCheck
{
private:
    static std::vector<LeakCheck*> objects;
public:
    virtual const char *getClassName() const = 0;
    LeakCheck();
    ~LeakCheck();
    friend class LeakCheckMaster;
};

// LeakCheck.cpp
#include <iostream>
class LeakCheckMaster
{
    ~LeakCheckMaster()
    {
        if (LeakCheck::objects.size()>0) {
            std::cerr << "Leaked objects:" << std::endl;
            for (int i=0; i<LeakCheck::objects.size(); i++)
                std::cerr << LeakCheck::objects[i]->getClassName() << std::endl;
        }
    }
} master;
std::vector<LeakCheck*> LeakCheck::objects;
LeakCheck::LeakCheck()
{
     objects->push_back(this);
}
LeakCheck::~LeakCheck()
{
     objects->remove(this);
}

テスト アプリケーションは次のようになります。

#include "LeakCheck.hpp"


class Test : public LeakCheck
{
    public:
        const char *getClassName() const
        {
             return "Test";
        }
};

int main()
{
    Test *a = new Test();
    return 0
}

ただし、アプリケーションをリンクしようとすると、「LeakCheck::getClassName() への未定義の参照」が表示されます。他の機能が機能するため、共有ライブラリとリンクしていると確信しています。

これは実際のコードではありません。問題に不可欠なコードだけを残すようにしました。何も見逃していないことを願っています。

では、なぜこのリンカ エラーが発生するのでしょうか。純粋な仮想から「名前のないクラス」を返すように変更すると。getClassName() 関数を実装したにもかかわらず、出力はすべてのオブジェクトを「名前のないクラス」として報告します。

共有ライブラリの境界を越えて抽象化することはできませんか?

4

1 に答える 1