簡體   English   中英

將 C++ 嵌套類分離到它們自己的頭文件中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM