2016-04-07 62 views
1

的功能,这是我的类定义:调用静态成员

#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这个类下载数据并调用回调参数的功能。

这是的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功能分为非静态,然后代码编译。

这是怎么回事?

+0

你有没有申报你的静态变量的定义?例如'WebReqeust CloudFunctions :: request;' – foo

+0

我应该在哪里声明它?你的意思是在课外? –

+0

是你的cpp – foo

回答

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

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

因此,任何类外,你只需要输入WebRequest CloudFunctions::request;

1

你实现CC文件应包含以下行:

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

小心不要碰到静态初始化顺序的悲剧。如果其他实现文件具有依赖于CloudFunctions::request的静态初始化,那么它们可能最终在初始化/构建之前使用它。

请考虑使用单例代替。

+0

感谢您的建议。我来自C#,而且我正处于被C++所提供的一切困惑的阶段:-) –

+0

直到最后一句话为止的最佳答案:_“请考虑使用单例。”_没有为你付出代价。 –

+0

谨慎阐述?我提出了一种解决静态初始化顺序问题的方法。 – LLFF