C++11 静态成员的调用函数

C++11 静态成员的调用函数,c++11,C++11,这是我的类定义: #ifndef CloudFunctions_hpp #define CloudFunctions_hpp #include "WebRequest.hpp" #include "external/json/document.h" #include <stdio.h> typedef std::function<void(const rapidjson::Document&)> CloudCallback; class CloudFunct

这是我的类定义:

#ifndef CloudFunctions_hpp
#define CloudFunctions_hpp

#include "WebRequest.hpp"
#include "external/json/document.h"
#include <stdio.h>

typedef std::function<void(const rapidjson::Document&)> CloudCallback;

class CloudFunctions
{
private:
public:
    static WebRequest request;
    static void GetData(const CloudCallback &callback);
};

#endif /* CloudFunctions_hpp */
不幸的是,这无法编译:

Undefined symbols for architecture x86_64:
  "CloudFunctions::request", referenced from:
      CloudFunctions::GetData(std::__1::function<void (rapidjson::GenericDocument<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>, rapidjson::CrtAllocator> const&)> const&) in CloudFunctions.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
如果我将请求成员和GetData函数转换为非静态函数,那么代码将编译

这是怎么回事?

因为请求是静态数据成员,所以必须在类声明之外的全局范围内初始化它。静态数据成员不会被任何构造函数初始化,因为它们不属于任何实例,所以在类声明中,您只是声明静态数据成员,而不是初始化或实例化它或您喜欢的任何其他术语。您需要一个静态上下文来初始化静态数据,这就是为什么您要在全局范围内这样做。即使会员是私人会员,你也可以这样做

因此,在任何类之外,只需键入WebRequestCloudFunctions::request

因为请求是静态数据成员,所以必须在类声明之外的全局范围内初始化它。静态数据成员不会被任何构造函数初始化,因为它们不属于任何实例,所以在类声明中,您只是声明静态数据成员,而不是初始化或实例化它或您喜欢的任何其他术语。您需要一个静态上下文来初始化静态数据,这就是为什么您要在全局范围内这样做。即使会员是私人会员,你也可以这样做


因此,在任何类之外,只需键入WebRequestCloudFunctions::request

您的实现cc文件应包括以下行:

WebRequest CloudFunctions::request; // include constructor arguments here
注意不要陷入静态初始化顺序的失败。如果其他实现文件具有依赖于CloudFunctions::request的静态初始化,则它们可能会在初始化/构造之前使用它


考虑改用单例。

您的实现cc文件应包括以下行:

WebRequest CloudFunctions::request; // include constructor arguments here
注意不要陷入静态初始化顺序的失败。如果其他实现文件具有依赖于CloudFunctions::request的静态初始化,则它们可能会在初始化/构造之前使用它


考虑改用单例。

您需要定义静态成员变量请求。你所做的只是提供一份声明。另见

例如:

class A
{
public:
  static int var;
};
在您的cpp中,您可以初始化它,然后:

int A::var = 0;
然后你可以这样使用它:

int main()
{
  A::var = 5;
}

您需要定义静态成员变量请求。你所做的只是提供一份声明。另见

例如:

class A
{
public:
  static int var;
};
在您的cpp中,您可以初始化它,然后:

int A::var = 0;
然后你可以这样使用它:

int main()
{
  A::var = 5;
}

您是否声明了静态变量的定义?e、 g.WebReqeust CloudFunctions::request;我应该在哪里申报?你是说课外?我应该吗?我的意思是它已经在类中定义了,我需要一个额外的声明吗?你为你的静态变量声明了一个定义吗?e、 g.WebReqeust CloudFunctions::request;我应该在哪里申报?你是说课外?我应该吗?我的意思是它已经在类中定义了,我需要一个额外的声明吗?谢谢你的建议。我来自C,我正处在被C++所提供的所有东西弄糊涂的阶段:-直到最后一句:伟大的答案:考虑使用单体代替。不要投你一票,想详细说明一下吗?我在建议一种避免静态初始化顺序问题的方法。谢谢你的建议。我来自C,我正处在被C++所提供的所有东西弄糊涂的阶段:-直到最后一句:伟大的答案:考虑使用单体代替。不要投你一票,想详细说明一下吗?我在建议一种避免可能出现的静态初始化顺序问题的方法。