У меня небольшая проблема с попыткой определить метку за пределами файла заголовка. Я начал пытаться изучать C ++ только три дня назад, поэтому, возможно, я допустил довольно очевидную ошибку, которую я не заметил. До сих пор мне не удалось заставить это работать.
Я хочу определить текст в MIDCSrc.cpp, в то время как объявление метки находится в MIDC.h. Пока что я сделал в MIDC.h:
*MIDC.h*
#include "MIDCSrc.cpp"
*VS Auto-generated code*
private: System::Windows::Forms::Label^ label1;
*VS Auto-generated code*
private: System::Void label1_Click(System::Object^ sender, System::EventArgs^ e)
{
textfunc2(label1);
}
А в MIDCSrc.cpp есть:
#include "MIDC.h"
namespace MIDC
{
void textfunc2(System::Windows::Forms::Label^ aLabel)
{
aLabel->Text = "Wow!";
}
}
(Я использую сообщество Visual Studio 2017)
Проблема в том, что я даже не могу проверить это, чтобы увидеть, что он с треском провалился, потому что это дает мне «Функция ошибки C2084 ‘void MIDC :: textfunc2 (System :: Windows :: Forms :: Label ^)’ уже имеет тело»
Как я уже сказал, мне жаль, если это очевидная ошибка, но я не могу понять эту прекрасную ошибку. Если что-то (и я знаю, что есть) не так с кодом, кроме ошибки тела, если возможно, сообщите мне. Должен исправить это.
Спасибо всем, кто отвечает 🙂
Попробуйте предложение, упомянутое пользователем 4581301: «Защита заголовка». Это предотвращает рекурсивное включение файлов. Это довольно просто:
#ifndef _MIDC_H
#define _MIDC_H
// here go the contents of MIDC.h
#endif
Сделайте то же самое в вашем файле CPP:
#ifndef _MIDCSRC_CPP
#define _MIDCSRC_CPP
// here goe the contents of MIDCSrc.cpp
#endif
Выбор символов # define’d произвольный. Имена, которые я выбрал здесь, являются обычной практикой. Хитрость в том, что содержимое файла включается только в том случае, если этот символ не определен, что является случаем по умолчанию. Первый шаг в теле #ifndef — это #define, поэтому условие #ifndef выполняется только один раз.
Других решений пока нет …