[英]Seperating C++ Nested Classes into their Own Header Files
本網站和 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(最后)-這是在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;
};
內部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";
}
確保在每個文件中包含您打算使用的所有內容。
分離聲明和定義是很常見的。
這是一種減少大型項目編譯時間的方法。
值得慶幸的是,模塊將很快™ 使鏈接成為過去。
為了解決錯誤消息:您將people
聲明為類OuterAPI
的原始成員指針……您無法通過使用operator .
的指針訪問成員operator .
,您需要使用operator ->
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.