首页 > 解决方案 > 将 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++ 新手,所以想确保我能做好。谢谢。

标签: c++classc++11pointers

解决方案


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";
}

推荐阅读