这个网站也是 C++ 新手,但希望看到大家的指导。
我有一个非常有趣的项目想法,即通过 API、类、引用等深入挖掘 C++,目前我有一个代码的工作示例,其中所有内容都存在于 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; }
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();
};
内部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(最后) - 这是编译器错误发生的地方
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
声明为 InnerAPI*
类型的成员。
您可以使用
api.people->get()
调用您的 API 或将成员设置为 InnerAPI
。
编辑:
除了指针问题之外,问题似乎还来自于处理文件包含的方式。我设法在 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;
};
InnerAPI.h
#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";
}
确保在每个文件中包含您打算使用的所有内容。
分离声明和定义是很常见的。
这是减少大型项目编译时间的一种方法。
值得庆幸的是,模块很快就会™让链接成为过去。
要解决错误消息:您将
people
声明为类 OuterAPI
的原始成员指针...您无法使用 operator .
通过指针访问成员,您需要使用 operator ->
。