调用静态成员的函数

时间:2016-04-07 19:17:30

标签: 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 CloudFunctions
{
private:
public:
    static WebRequest request;
    static void GetData(const CloudCallback &callback);
};

#endif /* CloudFunctions_hpp */

这个类基本上从rest api下载数据并在callback参数中调用该函数。

这是GetData函数:

void CloudFunctions::GetData(const CloudCallback &callback)
{
    CloudFunctions::request.get("decks", [&](const std::string &result){
        CCLOG("Loaded");
    });
}

不幸的是,这并没有编译:

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 函数转换为非静态函数,则会编译代码。

这里发生了什么?

3 个答案:

答案 0 :(得分:3)

您需要定义静态成员变量request。你所做的只是为它提供一个声明。另见Undefined reference to static variable c++

例如:

class A
{
public:
  static int var;
};

在你的cpp中你可以初始化它:

int A::var = 0;

然后你可以像这样使用它:

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

答案 1 :(得分:1)

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

因此,在任何课程之外,您只需输入WebRequest CloudFunctions::request;

即可

答案 2 :(得分:1)

您的实施cc文件应包含以下行:

WebRequest CloudFunctions::request; // include constructor arguments here

注意不要碰到静态初始化命令fiasco。如果其他实现文件具有依赖于CloudFunctions::request的静态初始化,则它们可能在初始化/构造之前最终使用它。

考虑使用单身人士。