【发布时间】:2021-12-25 01:48:07
【问题描述】:
刚接触这个网站和 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 文件
OuterAPI.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; }
InnerAPI.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();
};
InnerAPI.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++ 新手,所以想确保我能做好。谢谢。
【问题讨论】:
-
“代码不再编译。” 当代码编译失败时,您会收到一条错误消息。该特定信息很重要!它描述了需要解决的问题。你能edit这个问题包含我认为你不理解的错误信息吗?
-
OuterAPI.h缺少标头保护,它也有#include用于它不使用的标头,并且缺少#include用于它确实使用的东西。 (在许多 C++ 书籍中,如何组织代码经常被忽视或掩盖。) -
@DrewDormann,我将编译器错误消息放在“main.cpp”的代码 sn-p 中,但我可以更新为更具体。但是对你来说, api.people.get() 有错误“表达式必须具有类类型但类型为“OuterAPI::InnerAPI *”
-
@Eljay 我确实在头文件的顶部有一次#pragma,只是在代码 sn-p 中错过了它,对此感到抱歉。对包含的良好调用,但即使移动它们似乎也不会改变编译器错误