这是我的班级定义:
#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 函数转换为非静态函数,则会编译代码。
这里发生了什么?
答案 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
的静态初始化,则它们可能在初始化/构造之前最终使用它。
考虑使用单身人士。