Как создать экземпляр структуры внутри вложенного класса?

Поэтому я везде гуглил и не мог получить прямого ответа на свою проблему. Я давно не прикасался к C++, поэтому хотел приблизиться к минималистской структуре кодирования, но столкнулся с проблемой.

У меня есть вызов данных родительского класса в файле .h

У меня есть еще 2 класса, вложенных в данные, которые называются «Память» и «Функции».

Я создал 2 файла .cpp, по одному для каждого вложенного класса, «Memory.cpp» хранит данные переменных и структур, а «Functions.cpp» хранит данные функций.

У меня проблемы с классом "Память"

Я не могу найти способ или решение для создания экземпляров структур класса «Память», как бы я ни пытался

Вот мой файл 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);
    }
};

Вот мой файл main.cpp

#include "main.h"

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

Вот мой файл main.h

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

Я надеюсь, что этой информации достаточно, чтобы понять мою проблему, я не хочу публиковать свои файлы «Memory.cpp» и «Functions.cpp», слишком много информации. Спасибо всем, кто достаточно любезен, чтобы помочь мне.

Ну, трудно быть уверенным, основываясь на ограниченной информации, но я бы сказал, что структуры, которые вы определили в memory.cpp, должны быть перемещены в файл заголовка (предположительно, memory.h), и этот файл заголовка должен быть включен в классы. h, чтобы вы могли использовать там определения структур. Как правило, все, что вы хотите использовать более чем в одном файле на C++, необходимо определить или объявить в заголовочном файле.

john 19.08.2023 07:45

@john OOHHH Я понял, спасибо за это, поэтому файл .cpp не может определять/объявлять переменные.

Moorease 19.08.2023 07:49

Теперь вы меня сбиваете с толку, сначала вы сказали «структуры», теперь вы говорите «переменные». Это не одно и то же. Совершенно нормально определять переменные в файлах cpp (на самом деле это то, что вы должны делать), но если вы также хотите использовать эти переменные в другом файле, вы также должны объявить их в файле заголовка. Это требует, чтобы вы понимали разницу между определением и объявлением, что мне интересно, понимаете ли вы.

john 19.08.2023 07:52

Извините за то, что @john Я думаю, что теперь я решил это, спасибо.

Moorease 19.08.2023 07:53

Думаю, вам нужен дизайн PIMPL. Объект также кажется неподвижным, что является подсказкой для использования std::unique_ptr вместе с PIMPL.

Red.Wave 19.08.2023 12:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Члены класса должны быть полными типами, если тип неполный, вы можете использовать только указатель или ссылку на него.

Таким образом, вам нужно либо переместить определения sig, set и val в заголовочный файл, либо превратить sig0, set0 и val0 в ссылки (используйте с осторожностью, элементы ссылок имеют подводные камни) или (желательно умные) указатели.

При создании экземпляра из структуры определение структуры должно предшествовать созданию экземпляра в видимой или той же области, что и тип, из которого вы создаете экземпляр, должен быть полным.

Таким образом, прямое решение состоит в том, чтобы переместить определения sig, set и val из файла .cpp в файл заголовка. Другое решение — объявить sig0, set0 и val0 как указатели на соответствующие структуры и выделить для них память с помощью new в файле cpp.

Другие вопросы по теме