如何在嵌套类中实例化结构?

How do I instantiate structs inside a nested class?

提问人:Moorease 提问时间:8/19/2023 最后编辑:Moorease 更新时间:8/19/2023 访问量:55

问:

所以我到处谷歌,都找不到我的问题的直接答案。我已经有一段时间没有接触C++了,所以我想采用极简主义的编码结构,但我遇到了一个问题。

我有一个父类调用 .h 文件中的 Data

我还有 2 个嵌套在数据中的类,称为“内存”和“函数”

我创建了 2 个 .cpp 文件,每个嵌套类一个,“Memory.cpp”存储变量和结构数据,“Functions.cpp”存储函数数据

我在使用“Memory”类时遇到了问题

我找不到一种方法或解决方案来实例化“Memory”类的结构,尽我所能

这是我的 Classes.h 文件

#pragma once
#include "main.h"

class Data
{
public:

    class Memory
    {
    public:
        //I ALREADY CODED THE STRUCTS IN MY "MEMORY.CPP" FILE
        struct sig;
        struct set;
        struct val;

        //I TRIED WRITING THIS INSIDE THIS PUBLIC CLASS MEMORY AND ITS AN ERROR
        //sig sig0;
        //set set0;
        //val val0;
    };


    class Functions
    {
    public:
        void setup(Memory& gMem);
        void mainLoop(Memory& gMem);
    };

    Memory gMem;
    Functions gFunc;
    

    Data()
    {
        //I'M TRYING TO PASS BY REFERENCE SELF gMem INTO SETUP FUNCTION, 
        //WHICH THE FUNCTION ACCESSES THE STRUCTS INSIDE 
        //THE PUBLIC MEMORY CLASS
        //BUT IT CANNOT EVEN GRANT THIS
        this->gFunc.setup(this->gMem);
        this->gFunc.mainLoop(this->gMem);
    }
};

这是我的主要 .cpp 文件

#include "main.h"

int main()
{
    Data run;
    return 0;
}

这是我的main.h文件

#include <iostream>
#include <vector>
#include "Classes.h"

我希望这有足够的信息来解决我的问题,我不想发布我的“Memory.cpp”和“Functions.cpp”文件,它的信息太多了。感谢任何好心帮助我的人。

C++ 结构 嵌套 内部类

评论

1赞 john 8/19/2023
好吧,根据有限的信息很难确定,但我想说的是,您在 memory.cpp 中定义的结构需要移动到头文件(大概是 memory.h),并且该头文件需要包含在 classes.h 中,以便您可以在那里使用结构定义。通常,要在 C++ 中的多个文件中使用的任何内容都需要在头文件中定义或声明。
0赞 Moorease 8/19/2023
@john OOHHH 我明白了,谢谢你,所以.cpp文件无法定义/声明变量。
0赞 john 8/19/2023
现在你把我弄糊涂了,首先你说的是“结构”,现在你说的是“变量”,这些不是一回事。在 cpp 文件中定义变量是完全可以的(事实上这是你应该做的),但如果你还想在另一个文件中使用这些变量,那么你还必须在头文件中声明它们。这需要你了解定义和声明之间的区别,我想知道你是否了解。
0赞 Moorease 8/19/2023
对不起,@john我想我现在已经解决了,谢谢。
0赞 Red.Wave 8/19/2023
我想你需要一个PIMPL设计。该物体似乎也是不可移动的,这是与 PIMPL 一起使用的提示。std::unique_ptr

答:

2赞 Alan Birtles 8/19/2023 #1

类成员必须是完整的类型,如果类型不完整,则只能使用指针或对它的引用。

因此,您要么需要将 和 的定义移动到头文件中,要么将 和 转到引用中(谨慎使用,引用成员有陷阱)或(最好是智能)指针。sigsetvalsig0set0val0

0赞 machine_1 8/19/2023 #2

从结构实例化时,结构定义必须位于可见或相同作用域中的实例化之前,因为要从中实例化的类型必须完整。

因此,直接的解决方案是将 sig、set 和 val 的定义从 .cpp 文件移动到头文件。另一种解决方案是将 sig0、set0 和 val0 声明为指向相应结构体的指针,并在 cpp 文件中为它们分配内存。new