c++ - 将 C++ 嵌套类分离到它们自己的头文件中
问题描述
这个网站和 C++ 的新手,但希望看到每个人的一些指导。
我有一个非常有趣的项目想法来学习 C++ 深入挖掘 API、类、引用等,目前我有一个代码的工作示例,其中所有内容都存在于 main.cpp 文件中。我面临的问题是,当我将类(内部和外部)移动到它们各自的头文件时,代码不再编译。
嵌套类的原因是 OuterAPI 充当 API 的主要入口点,并具有许多较低级别的 API,然后可以在其下访问(人员、许可证、角色等)。这样,API 用户只需为 OuterAPI 创建一个对象,然后为底层资源和方法创建点符号。
这是 main.cpp 中的工作示例
#include <iostream>
#include <nlohmann/json.hpp>
#include <cpr/cpr.h>
using json = nlohmann::json;
class OuterAPI {
private:
class InnerAPI {
private:
OuterAPI& api;
public:
InnerAPI(OuterAPI& a) :api(a) {}
json get() {
cpr::Response r = cpr::Get(
cpr::Url{ api.baseUrl + "resource" },
cpr::Bearer{ api.token }
);
return json::parse(r.text)
};
std::string token;
std::string baseUrl = "";
public:
InnerAPI people;
OuterAPI(std::string t) : token(t), people(*this) {}
};
int main(int argc, char** argv)
{
std::string token = "";
OuterAPI api(token);
json jsonData = api.people.get();
std::cout << jsonData.dump(4) << std::endl;
return 0;
}
这是我将所有内容移动到相应的头文件/cpp 文件
外部API.h
#pragma once
class OuterAPI {
private:
class InnerAPI;
std::string token;
std::string baseUrl = "";
public:
OuterAPI(std::string t);
~OuterAPI();
InnerAPI* people;
};
外部API.cpp
#include "WebexAPI.h"
#include "PeopleAPI.h"
OuterAPI::OuterAPI(std::string t) : token(t) {
people = new InnerAPI(*this);
}
OuterAPI::~OuterAPI() { delete people; }
内部API.h
#pragma once
#include <nlohmann/json.hpp>
#include <cpr/cpr.h>
#include "OuterAPI.h"
using json = nlohmann::json;
class OuterAPI::InnerAPI {
private:
OuterAPI& api;
public:
InnerAPI(OuterAPI& a);
json get();
};
内部API.cpp
#include "InnerAPI.h"
OuterAPI::InnerAPI::InnerAPI(OuterAPI& a) : api(a) {}
json OuterAPI::InnerAPI::get() {
cpr::Response r = cpr::Get(
cpr::Url{ api.baseUrl + "resource" },
cpr::Bearer{ api.token }
);
return json::parse(r.text);
main.cpp (finally) - 这是编译器错误发生在api.people.get()
“ expression must have class type but has type "OuterAPI::InnerAPI *
”的地方
int main(int argc, char** argv)
{
std::string token = "";
OuterAPI api(token);
json jsonData = api.people.get(); // COMPILER ERROR "expression must have class type but has type "OuterAPI::InnerAPI *"
std::cout << jsonData.dump(4) << std::endl;
return 0;
}
由此我相信这个问题与我必须将InnerAPI
对象定义people
为内部的指针有关,OuterAPI
但从这里我似乎无法解决。
另外,也请随意批评我的设计,就像我说我是 C++ 新手,所以想确保我能做好。谢谢。
解决方案
在OuterAPI*
您已声明people
为 type 的成员InnerAPI*
。
您可以使用api.people->get()
或将成员InnerAPI
改为 a 来调用您的 API。
编辑:
除了指针之外,似乎错误来自您处理文件包含的方式。我设法在 REPL.it 上获得了一个工作版本。我做了一些细微的调整,这样我就不必把两个库都集中在它的要点上。这里是:
外部API.h
#pragma once
#include <string>
class OuterAPI {
private:
class InnerAPI;
std::string token;
std::string baseUrl = "";
public:
OuterAPI(std::string t);
~OuterAPI();
InnerAPI* people;
};
内部API.j
#pragma once
#include "./OuterAPI.h"
class OuterAPI::InnerAPI {
private:
OuterAPI& api;
public:
InnerAPI(OuterAPI& a);
std::string get();
};
外部API.cpp
#include "./OuterAPI.h"
#include "./InnerAPI.h"
OuterAPI::OuterAPI(std::string t) : token(t) {
people = new InnerAPI(*this);
}
OuterAPI::~OuterAPI() { delete people; }
内部API.cpp
#include "./OuterAPI.h"
#include "./InnerAPI.h"
OuterAPI::InnerAPI::InnerAPI(OuterAPI& a) : api(a) {}
std::string OuterAPI::InnerAPI::get() {
return api.baseUrl + "resource";
}
推荐阅读
- javascript - Javascript - 有选择地禁用 Key Down
- javascript - 如何手动创建 Git blob 对象,然后使用 node.js 读取内容,就像在 Git 内部的 ProGit 章节中一样?
- css - CSS过渡不透明度在手机上不起作用
- rust - 具有多个生命周期的迭代器
- javascript - 如何使用 Apify 和 Puppeteer 构建成功的网络抓取结果?
- applescript - 为 AppleScript 小程序定制 info.plist 文件
- powerbi - PowerBI 报告在 DirectQuery 模式下运行缓慢
- python - 生成两个字符域名 az 0-9 时使用运算符时遇到问题
- linq - c#中动态对象的展平列表
- c# - 使用 c# 和此人员库 NmapXmlParser 从 NMAP 输出解析 XML 数据