Поэтому я везде гуглил и не мог получить прямого ответа на свою проблему. Я давно не прикасался к 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», слишком много информации. Спасибо всем, кто достаточно любезен, чтобы помочь мне.
@john OOHHH Я понял, спасибо за это, поэтому файл .cpp не может определять/объявлять переменные.
Теперь вы меня сбиваете с толку, сначала вы сказали «структуры», теперь вы говорите «переменные». Это не одно и то же. Совершенно нормально определять переменные в файлах cpp (на самом деле это то, что вы должны делать), но если вы также хотите использовать эти переменные в другом файле, вы также должны объявить их в файле заголовка. Это требует, чтобы вы понимали разницу между определением и объявлением, что мне интересно, понимаете ли вы.
Извините за то, что @john Я думаю, что теперь я решил это, спасибо.
Думаю, вам нужен дизайн PIMPL. Объект также кажется неподвижным, что является подсказкой для использования std::unique_ptr вместе с PIMPL.





Члены класса должны быть полными типами, если тип неполный, вы можете использовать только указатель или ссылку на него.
Таким образом, вам нужно либо переместить определения sig, set и val в заголовочный файл, либо превратить sig0, set0 и val0 в ссылки (используйте с осторожностью, элементы ссылок имеют подводные камни) или (желательно умные) указатели.
При создании экземпляра из структуры определение структуры должно предшествовать созданию экземпляра в видимой или той же области, что и тип, из которого вы создаете экземпляр, должен быть полным.
Таким образом, прямое решение состоит в том, чтобы переместить определения sig, set и val из файла .cpp в файл заголовка. Другое решение — объявить sig0, set0 и val0 как указатели на соответствующие структуры и выделить для них память с помощью new в файле cpp.
Ну, трудно быть уверенным, основываясь на ограниченной информации, но я бы сказал, что структуры, которые вы определили в memory.cpp, должны быть перемещены в файл заголовка (предположительно, memory.h), и этот файл заголовка должен быть включен в классы. h, чтобы вы могли использовать там определения структур. Как правило, все, что вы хотите использовать более чем в одном файле на C++, необходимо определить или объявить в заголовочном файле.