C++中将类分离到头文件与CPP文件时遇问题,附主CPP代码求助
从你贴的主CPP代码片段来看,我先帮你梳理几个可能导致类分离失败的常见坑:
首先整理下你提供的代码片段(格式化后):
#include "myclasses.h" #include <math.h> #include <string.h> #include "stdafx.h" #include <fstream> #include <stdio.h> #include <stdlib.h> #include <vector> // .....我的其他头文件.... const int populationsize = 10; Chrom temp; chrom popcurrent[populationsize]; chrom poptemp; chrom popnext[populationsize]; chrom popnextxover[populationsize]; // 还有一些其他相关代码内容
接下来是几个需要重点检查的方向:
头文件包含顺序问题:
如果你用的是Visual Studio的预编译头stdafx.h,它必须是第一个被包含的头文件,否则预编译头的机制会失效,导致各种奇怪的编译错误。把#include "stdafx.h"移到所有包含语句的最前面。类名大小写一致性:
C++是大小写敏感的,你代码里同时出现了Chrom temp;和chrom popcurrent[...]——这两个会被编译器当成完全不同的类型。如果是笔误,赶紧统一成同一个类名(比如全用Chrom);如果确实是两个不同的类,要确保chrom也在myclasses.h或者其他已包含的头文件里有正确的声明。头文件保护机制:
打开你的myclasses.h,检查有没有加头文件保护。如果没有,当多个cpp文件包含它时,会触发类的重复定义错误。标准的写法是:#ifndef MYCLASSES_H #define MYCLASSES_H // 这里写你的类声明,比如: class Chrom { // 成员变量和成员函数声明 }; #endif // MYCLASSES_H也可以用更简洁的
#pragma once(目前主流编译器都支持)。类的实现与声明分离:
确保你在myclasses.cpp里正确实现了Chrom类的所有成员函数。比如如果Chrom有一个成员函数void calculate(),头文件里声明后,cpp文件里要写:#include "myclasses.h" void Chrom::calculate() { // 函数实现代码 }如果只在头文件里声明了类,却没有在cpp文件里实现成员函数,链接阶段会报「未定义的符号」错误。
全局变量的定义问题:
你在主cpp里定义的这些全局变量(比如popcurrent、popnext)如果需要在其他cpp文件里使用,要注意用extern声明,避免重复定义。不过如果只是在主cpp里自用,这个问题不大。
如果还有具体的编译/链接错误提示,可以贴出来,这样能更精准地定位问题~
内容的提问来源于stack exchange,提问作者questionaskerprogrammer

