C++ c++;如果函数在.cpp中实现,则链接错误

C++ c++;如果函数在.cpp中实现,则链接错误,c++,static,singleton,linker-errors,C++,Static,Singleton,Linker Errors,如果我在.cpp中实现类的create方法,我会得到 错误LNK2019:未解析的外部符号“受保护:u thiscall Singleton::Singleton(void)”(??0 Singleton@@IAE@XZ)在函数“public:static void_uucdecl Singleton::create(void)”中引用(?create@Singleton@@萨克斯克斯 但是,如果我在头文件中实现该方法,它编译时不会出现任何错误:S 头文件 #pragma once #inc

如果我在.cpp中实现类的create方法,我会得到

错误LNK2019:未解析的外部符号“受保护:u thiscall Singleton::Singleton(void)”(??0 Singleton@@IAE@XZ)在函数“public:static void_uucdecl Singleton::create(void)”中引用(?create@Singleton@@萨克斯克斯

但是,如果我在头文件中实现该方法,它编译时不会出现任何错误:S

头文件

 #pragma once
 #include <iostream>
class Singleton
{
 public:

static Singleton * getInstance()
{
    return s_instance;
}

static void create();
static void destroy();

void help();

protected:

static Singleton * s_instance;
Singleton();
};
但是,如果我在头中实现create方法,它不会抛出任何错误

头文件中实现了create方法

#pragma once
#include <iostream>
class Singleton
{
public:

    static Singleton * getInstance()
    {
        return s_instance;
    }

    static void create(){
        if (!s_instance)
        {
            s_instance = new Singleton;
        }
    }
    static void destroy();


protected:

    static Singleton * s_instance;
    Singleton();
};
#pragma一次
#包括
单件阶级
{
公众:
静态单例*getInstance()
{
返回s_实例;
}
静态void create(){
如果(!s_实例)
{
s_实例=新单例;
}
}
静态空洞破坏();
受保护的:
静态单例*s_实例;
Singleton();
};

在cpp中,您的create函数正在尝试使用new运算符初始化Singleton,但您没有为其提供构造函数。请尝试为
Singleton()
提供一个实现。例如:

protected:

    static Singleton * s_instance;
    Singleton() {}
};

在cpp中,您的create函数试图通过使用new运算符初始化Singleton,但您没有为其提供构造函数。请尝试为
Singleton()
提供实现。例如:

protected:

    static Singleton * s_instance;
    Singleton() {}
};

在cpp中,您的create函数试图通过使用new运算符初始化Singleton,但您没有为其提供构造函数。请尝试为
Singleton()
提供实现。例如:

protected:

    static Singleton * s_instance;
    Singleton() {}
};

在cpp中,您的create函数试图通过使用new运算符初始化Singleton,但您没有为其提供构造函数。请尝试为
Singleton()
提供实现。例如:

protected:

    static Singleton * s_instance;
    Singleton() {}
};
这个问题。 您已经声明了一个默认构造函数,并且正在使用它(在
new
表达式中),但尚未实现它

修理 只需删除构造函数声明:

protected:

    static Singleton * s_instance;
    // Singleton();  -- don't have this. Remove it.
};
其他事项。 使用
受保护的
特性,类是为继承而设计的,那么如何确保派生类只能通过单例机制实例化呢

您对派生类没有太多的控制权,因此最简单的方法就是记录每个派生类应该声明和定义一个非public默认构造函数

然而,有一个技巧可以用来实现这一点,因为虚拟基必须由派生最多的类初始化。这可以用来强制客户端代码在底部添加最终的类派生。其中派生最多的类是一个模板实例化,它定义了一个非公共构造函数

一个更实际的选择是把事情颠倒过来

这是不是为了设计<代码> Stutelon < /Cord>类(由受保护的东西发出信号),而是设计它从客户端代码类继承。这意味着使用模板。Andrei Alexandrescu在他的经典著作《现代C++设计》中讨论了一些单例方法。 您已经声明了一个默认构造函数,并且正在使用它(在

new
表达式中),但尚未实现它

修理 只需删除构造函数声明:

protected:

    static Singleton * s_instance;
    // Singleton();  -- don't have this. Remove it.
};
其他事项。 使用
受保护的
特性,类是为继承而设计的,那么如何确保派生类只能通过单例机制实例化呢

您对派生类没有太多的控制权,因此最简单的方法就是记录每个派生类应该声明和定义一个非public默认构造函数

然而,有一个技巧可以用来实现这一点,因为虚拟基必须由派生最多的类初始化。这可以用来强制客户端代码在底部添加最终的类派生。其中派生最多的类是一个模板实例化,它定义了一个非公共构造函数

一个更实际的选择是把事情颠倒过来

这是不是为了设计<代码> Stutelon < /Cord>类(由受保护的东西发出信号),而是设计它从客户端代码类继承。这意味着使用模板。Andrei Alexandrescu在他的经典著作《现代C++设计》中讨论了一些单例方法。 您已经声明了一个默认构造函数,并且正在使用它(在

new
表达式中),但尚未实现它

修理 只需删除构造函数声明:

protected:

    static Singleton * s_instance;
    // Singleton();  -- don't have this. Remove it.
};
其他事项。 使用
受保护的
特性,类是为继承而设计的,那么如何确保派生类只能通过单例机制实例化呢

您对派生类没有太多的控制权,因此最简单的方法就是记录每个派生类应该声明和定义一个非public默认构造函数

然而,有一个技巧可以用来实现这一点,因为虚拟基必须由派生最多的类初始化。这可以用来强制客户端代码在底部添加最终的类派生。其中派生最多的类是一个模板实例化,它定义了一个非公共构造函数

一个更实际的选择是把事情颠倒过来

这是不是为了设计<代码> Stutelon < /Cord>类(由受保护的东西发出信号),而是设计它从客户端代码类继承。这意味着使用模板。Andrei Alexandrescu在他的经典著作《现代C++设计》中讨论了一些单例方法。 您已经声明了一个默认构造函数,并且正在使用它(在

new
表达式中),但尚未实现它

修理 只需删除构造函数声明:

protected:

    static Singleton * s_instance;
    // Singleton();  -- don't have this. Remove it.
};
其他事项。 有
保护的