将 C++ 嵌套类分离到它们自己的头文件中

问题描述 投票:0回答:2

这个网站也是 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++ 新手,所以想确保我能做好工作。谢谢。

c++ class c++11 pointers
2个回答
1
投票

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

0
投票

确保在每个文件中包含您打算使用的所有内容。
分离声明和定义是很常见的。
这是减少大型项目编译时间的一种方法。
值得庆幸的是,模块很快就会™让链接成为过去。

要解决错误消息:您将

people
声明为类
OuterAPI
的原始成员指针...您无法使用
operator .
通过指针访问成员,您需要使用
operator ->

© www.soinside.com 2019 - 2024. All rights reserved.