2

感谢大家帮助我^^我的问题已经解决了!

当我使用 C++ 语言在内部类中使用 Singleton 时遇到问题。请帮助我,并为我的英语不好感到抱歉。

class A: public AA
{
    class InnerA
    {
        private:
            static InnerA* _innerA;
        public:
            ~InnerA();
            void Release();

            static InnerA* GetInstance()
            {
                if (_innerA == NULL)
                {
                    static InnerA static_instance;
                    _innerA = &static_instance;
                }
                return _innerA ;
            };
.....

编译后控制台显示以下错误:

undefined reference to `A::InnerA::_innerA'

我也像下面的代码一样修改,但我仍然遇到上述错误。

class A: public AA
    {
        class InnerA
        {
            private:
                static InnerA* _innerA;
            public:
                ~InnerA();
                void Release();

                static InnerA* GetInstance()
                {
                    if (A::InnerA::_innerA == NULL)
                    {
                        static A::InnerA::_innerA static_instance;
                        _A::InnerA::_innerA = &static_instance;
                    }
                    return A::InnerA::_innerA;
                };
    .....

请帮我 !!!非常感谢

4

4 回答 4

2

类的所有静态数据成员都必须在某处定义。将以下内容放入 .cpp 文件中:

A::InnerA *A::InnerA::_innerA;

然而,你真的需要那个静态指针吗?你可以像这样简化你的代码:

class A: public AA
{
    class InnerA
    {
        public:
            ~InnerA();
            void Release();

            static InnerA* GetInstance()
            {
                static InnerA static_instance;
                return &static_instance;
            }
.....

然后,您将不需要任何静态成员定义。

于 2013-04-16T12:19:26.587 回答
1

首先要做的事情是:您将单例模式的两种不同实现混为一谈。

实施1

可信赖的泄漏单例。

// Singleton.hpp
class Singleton {
public:
    static Singleton& Instance() {
        if (I == nullptr) { I = new Singleton(); }
        return *I;
    }

private:
    Singleton();
    ~Singleton();

    static Singleton* I;
};

// Singleton.cpp
Singleton* Singleton::I = 0;

两个问题:

  • 泄漏,除非您实现Release并确保调用它(一次)
  • 不是线程安全的

实施 2

被称为迈耶斯的单身人士。

// Singleton.hpp
class Singleton {
public:
    static Singleton& Instance() {
        static Singleton S;
        return S;
    }

private:
    Singleton();
    ~Singleton();
};

主要问题:

您应该选择其中任何一个,但不要将两者混为一谈。

于 2013-04-16T12:50:35.540 回答
0

你总是定义静态数据成员。把它放在main之前,就在你的class A定义之下:

A::InnerA *A::InnerA::_innerA;
于 2013-04-16T12:20:44.717 回答
0

在您的 A 类实现文件中,您必须编写类似\

A::InnerA *A::InnerA::_innerA;

完成成员的定义。在标题中,您只声明成员,但不定义它。

于 2013-04-16T12:23:22.167 回答