在C ++中使用Innerton in Inner Class

时间:2013-04-16 12:14:31

标签: c++ singleton

感谢大家,因为帮助了我^^我的问题得到了解决!

当我使用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;
                };
    .....

请帮帮我!!!非常感谢

5 个答案:

答案 0 :(得分: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;
            }
.....

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

答案 1 :(得分:1)

首先要做的事情是:你正在混淆Singleton模式的两个不同的实现。

实施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;

两个问题:

  • 泄漏,除非您实施发布并确保调用它(一次)
  • 非线程安全

实施2

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

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

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

主要问题:

你应该选择其中之一,但不能混合两者。

答案 2 :(得分:0)

您必须在实现代码中声明变量,而不仅仅是在标题中。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

的内容
A::InnerA *A::InnerA::_innerA;

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