Вопрос по c++, linker, static, undefined-reference, singleton – C ++: неопределенная ссылка на экземпляр в классе Singleton

8

В настоящее время я пытаюсь реализовать завод как синглтон. Я практически использовал учебный пример синглтон-паттерна. Вот's .h файл:

namespace oxygen{

class ImpFactory{

public:
    static boost::shared_ptr GetInstance();

private:
    static boost::shared_ptr mInstance;
};

и здесь's .pppp файл:

#include "impfactory.h"

using namespace oxygen;
using namespace boost;

shared_ptr ImpFactory::GetInstance(){
    if (mInstance.get() == 0)
        mInstance = shared_ptr(new ImpFactory());
    return mInstance;
}

Код компилируется, но я получаю ошибку компоновщика:

../../lib/oxygen/liboxygen.so.3.2.4: неопределенная ссылка на 'oxygen :: ImpFactory :: mInstance'

Это в настоящее время имеет три студента в тупик. Есть идеи?

Ваш Ответ

5   ответов
0

вы можете рассмотреть синглтон-классы Boost. Проверять, выписываться:

#include <boost serialization="" singleton.hpp="">

using namespace boost::serialisation;

struct MyClass : public singleton<myclass>
{ string name_; int age_; };

int main( int argc, char* argv[] )
{
    MyClass::get_mutable_instance().name_ = "Robin";
    MyClass::get_mutable_instance().age_ = 21;
}
</myclass></boost>

То, что вы используете, зависит от того, что выделаешь В то время как я'Немного анти-синглтон по обычным причинам имеет смысл использовать повторно, где это возможно. Однако, предупреждающее слово: синглтон Boost немного переместился в библиотеках, так что это может варьироваться в зависимости от того, какую версию Boost вы используете.повторное использование.

Я думаю это'не так уж много "переехал " как "добавили, когда кто-то думал, что они хотели синглтон, а затем удалили, когда они поняли, что это нетакая хорошая идея в конце концов ". Mike Seymour
0

возможно, вам следует сделать указатель экземпляра статическим членом функции get, а не класса, это нене имеет большого значения, когда вы используете метод new / pointer. но если вы просто создаете статический экземпляр (т.е. не используете указатель и не возвращаете ссылку на него из функции get get), это имеет большое значение, потому что:

если это статический член класса, его конструктор вызывается всякий раз (потому что он глобальный), если он статический член функции get, он не 'построено доЭта функция, вызываемая в первый раз, облегчает некоторые проблемы, возникающие у людей с синглетами, и их прославляют глобалы. Другое дело, что большинство компоновщиков пропускают функцию get и, следовательно, статический экземпляр целиком, если он никогда не вызывается, поэтому 'не нужно беспокоиться о вызове нового, чтобы он использовал память только еслииспользуется.

2

Вам нужно определение для вашего статического члена в файле cpp.

boost::shared_ptr<impfactory> ImpFactory::mInstance;
</impfactory>
14

определять статический экземпляр, а не просто объявить его. Определение создает фактический объект, на который вы ссылаетесь.

В вашемcpp файл, добавьте строку:

boost::shared_ptr<impfactory> ImpFactory::mInstance;
</impfactory>
2

В вашем C ++ добавить это:

boost::shared_ptr<impfactory> ImpFactory::mInstance;
</impfactory>

Похожие вопросы