C++代码编译报错:main重定义、标识符未声明等问题求助
C++编译错误解决方案
问题描述
编写了一段C++代码,意图初始化全局对象并通过main()启动菜单,但遭遇多个编译错误,谷歌搜索未找到解决办法,特求助。
相关代码
// 主cpp文件:Maschinenplanung_Marco.cpp #include <iostream> #include <stdio.h> #include "CPlanung.h" #include "CBuchung.h" using namespace std; CPlanung cp; CMaschine Maschinen[5] = { Maschinen[0] = CMaschine(1, "Drehbank"), Maschinen[1] = CMaschine(2, "Fräser"), Maschinen[2] = CMaschine(3, "Schleifmaschine"), Maschinen[3] = CMaschine(4, "Automat 1"), Maschinen[4] = CMaschine(5, "Automat 2") }; CProjekt Projekt[10] = { Projekt[0] = CProjekt(1, "Winkel"), Projekt[1] = CProjekt(2, "Strebe"), Projekt[2] = CProjekt(3, "Stütze"), Projekt[3] = CProjekt(4, "Halterung"), Projekt[4] = CProjekt(5, "Winkel"), Projekt[5] = CProjekt(6, "Sockel"), Projekt[6] = CProjekt(7, "Abdeckung"), Projekt[7] = CProjekt(8, "Befestigung"), Projekt[8] = CProjekt(9, "Anschluss"), Projekt[9] = CProjekt(10, "Lager") }; int main() { cp.StartProjekt(); return 0; }
// CBuchung.h #pragma once #include <cstddef> #include <iostream> #include <algorithm> #include <vector> #include "CProjekt.h" #include "CPlanung.h" #include "Maschinenplanung_Marco.cpp" // 错误:头文件包含cpp文件 using namespace std; class CBuchung { protected: struct Buchung { int _maschine; int _projekt; int _beginn; int _ende; }_buchungen[200] = { {3, 1, 1, 1},{4, 1, 2, 3}, {4, 4, 2, 5}, {3, 1, 4, 5},{3, 5, 5, 6},{3,1,10,11}, {3,2,11,11} }, buchung; bool existsMasch, existsBeginn, existsProj, exists; int n, temp, sum; public: CBuchung(); //Konstruktor void Buchen(int Maschine, int Projekt, int Beginn, int Ende); void Stornieren(int Maschine, int Projekt, int Beginn, int Ende); void getBuchungenProj(int Projekt); void getBuchungenMasch(int Maschine); void Belegung(); };
// CPlanung.h #pragma once #include <iostream> #include "CMaschine.h" #include "CProjekt.h" #include "CBuchung.h" #include "Maschinenplanung_Marco.cpp" // 错误:头文件包含cpp文件 using namespace std; class CPlanung { protected: int wahl, maschinenWahl, projektWahl, beginn, ende; public: CPlanung(); void StartProjekt(void); void Buchen(void); void Stornieren(void); void Projektliste(void); void Maschinenliste(void); void Belegung(void); void Doppelbelegung(void); };
编译错误信息
- 错误 C2065:"cp":未声明的标识符,项目MaschinenPlanung_Marco,文件C:\Users\danie\source\repos\MaschinenPlanung_Marco\MaschinenPlanung_Marco\Maschinenplanung_Marco.cpp,第36行
- 错误 C2374:"Maschinen":重复定义;多次初始化,上述文件第9行
- 错误 C2084:函数"int main(void)"已有函数体,上述文件第34行(出现两次)
错误原因及解决方法
1. 头文件包含cpp文件导致重复定义(错误2、3)
原因:在CBuchung.h和CPlanung.h中都包含了Maschinenplanung_Marco.cpp,当这些头文件被包含到主cpp中时,cpp文件内容会被重复编译,导致全局变量Maschinen和main函数被多次定义。
解决方法:
- 移除所有头文件中对
.cpp文件的#include语句,头文件仅负责声明类、函数和常量,实现代码必须放在单独的.cpp文件中。 - 为每个类创建对应实现文件,比如
CBuchung.cpp实现CBuchung类成员函数,CPlanung.cpp实现CPlanung类成员函数。
2. 循环头文件包含导致CPlanung未提前声明(错误1)
原因:CPlanung.h包含CBuchung.h,CBuchung.h又包含CPlanung.h,形成循环依赖,编译器处理主cpp时,定义全局对象cp前无法正确解析CPlanung类,导致"cp未声明"。
解决方法:
- 在
CBuchung.h中,用前向声明替代直接包含CPlanung.h:// CBuchung.h中替换#include "CPlanung.h"为: class CPlanung; - 仅当需要访问
CPlanung类具体成员时,才在CBuchung.cpp中包含CPlanung.h。
3. 全局数组初始化方式错误
原因:全局数组Maschinen和Projekt使用Maschinen[0] = ...的赋值语法,这不是合法的数组初始化列表写法,会引发编译异常。
解决方法:
- 使用标准列表初始化语法:
CMaschine Maschinen[5] = { CMaschine(1, "Drehbank"), CMaschine(2, "Fräser"), CMaschine(3, "Schleifmaschine"), CMaschine(4, "Automat 1"), CMaschine(5, "Automat 2") }; CProjekt Projekt[10] = { CProjekt(1, "Winkel"), CProjekt(2, "Strebe"), CProjekt(3, "Stütze"), CProjekt(4, "Halterung"), CProjekt(5, "Winkel"), CProjekt(6, "Sockel"), CProjekt(7, "Abdeckung"), CProjekt(8, "Befestigung"), CProjekt(9, "Anschluss"), CProjekt(10, "Lager") };
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

