如何引用在外部.cpp文件中定义的枚举变量
时间: 2024-09-21 13:08:28 浏览: 43
在C++中,如果你有一个枚举类型定义在单独的外部`.cpp`文件中,你需要通过包含该文件的方式才能在主程序中引用它。以下是步骤:
1. **声明**:首先,在`*.h`(头文件)文件中,只声明枚举类型及其名称,不提供具体的值。例如:
```cpp
// file: my_enum.h
extern enum MyEnum { ENUM_VALUE1, ENUM_VALUE2 };
```
2. **定义**:然后,在对应的`*.cpp`文件中,即包含该枚举的文件中,为枚举提供详细的定义和可能的值:
```cpp
// file: my_enum.cpp
#include "my_enum.h"
enum MyEnum { ENUM_VALUE1 = 0, ENUM_VALUE2 = 1 };
```
3. **引用**:在需要使用这个枚举的地方,如其他`.cpp`文件,只需包含相应的`*.h`文件即可,并可以正常使用枚举:
```cpp
// file: main.cpp
#include "my_enum.h" // 包含头文件
void myFunction(MyEnum value) {
// 使用枚举变量
}
```
记得要在编译整个项目时链接所有的`.cpp`文件,这样才能确保枚举变量在整个项目中可见。
相关问题
1、定义一个CAnimal类: 1)在该类中包含五个成员变量:一个是表示名称的string类型变量;另一个是表示出生日期的tm类型变量;还有一个表示类别的enum类型变量(比如:哺乳动物、爬行动物、两栖动物、鸟类等);表示产地的string类型变量;表示体重的静态变量;同时以不同的访问控制符加以区分; 2)定义合适的构造函数与拷贝构造函数; 3)实现不同类别动物数量、重量的统计与动物年龄实时计算(使用静态数组和静态变量成员); 4)使用内联函数为相应的成员变量设置接口; 5)实现对象信息的展示与输出(注意静态成员与非静态成员的区别); 6)在外部定义一个友元函数实现类中对象信息的展示与输出; 7)在main函数中定义CAnimal的10个实例,然后输出显示每一个实例的信息,同时输出相应的统计信息。
```cpp
#include <iostream>
#include <string>
#include <ctime>
using namespace std;
// 定义动物类别的枚举类型
enum AnimalType {
Mammal, // 哺乳动物
Reptile, // 爬行动物
Amphibian, // 两栖动物
Bird // 鸟类
};
// 动物类
class CAnimal {
private:
string m_name; // 名称
tm m_birthday; // 出生日期
AnimalType m_type; // 类别
string m_origin; // 产地
static double s_weight; // 体重
public:
// 构造函数
CAnimal(string name, tm birthday, AnimalType type, string origin) :
m_name(name), m_birthday(birthday), m_type(type), m_origin(origin) {}
// 拷贝构造函数
CAnimal(const CAnimal& other) :
m_name(other.m_name), m_birthday(other.m_birthday), m_type(other.m_type), m_origin(other.m_origin) {}
// 设置名称
inline void SetName(string name) { m_name = name; }
// 设置出生日期
inline void SetBirthday(tm birthday) { m_birthday = birthday; }
// 设置类别
inline void SetType(AnimalType type) { m_type = type; }
// 设置产地
inline void SetOrigin(string origin) { m_origin = origin; }
// 友元函数,输出对象信息
friend void PrintAnimalInfo(const CAnimal& animal);
// 静态变量,记录所有动物的体重
static double s_totalWeight;
// 静态数组,记录不同类别动物的数量
static int s_animalCount[4];
// 静态数组,记录不同类别动物的体重总和
static double s_animalWeight[4];
// 实时计算年龄
int GetAge() {
time_t now = time(0);
tm* today = localtime(&now);
int age = today->tm_year - m_birthday.tm_year;
if (today->tm_mon < m_birthday.tm_mon ||
(today->tm_mon == m_birthday.tm_mon && today->tm_mday < m_birthday.tm_mday)) {
age--;
}
return age;
}
// 展示对象信息
void ShowInfo() const {
cout << "名称:" << m_name << endl;
cout << "出生日期:" << m_birthday.tm_year + 1900 << "年"
<< m_birthday.tm_mon + 1 << "月" << m_birthday.tm_mday << "日" << endl;
cout << "类别:";
switch (m_type) {
case Mammal:
cout << "哺乳动物" << endl;
break;
case Reptile:
cout << "爬行动物" << endl;
break;
case Amphibian:
cout << "两栖动物" << endl;
break;
case Bird:
cout << "鸟类" << endl;
break;
}
cout << "产地:" << m_origin << endl;
cout << "体重:" << s_weight << "千克" << endl;
}
};
// 静态变量初始化
double CAnimal::s_weight = 0.0;
double CAnimal::s_totalWeight = 0.0;
int CAnimal::s_animalCount[4] = { 0 };
double CAnimal::s_animalWeight[4] = { 0.0 };
// 友元函数定义
void PrintAnimalInfo(const CAnimal& animal) {
cout << "名称:" << animal.m_name << endl;
cout << "出生日期:" << animal.m_birthday.tm_year + 1900 << "年"
<< animal.m_birthday.tm_mon + 1 << "月" << animal.m_birthday.tm_mday << "日" << endl;
cout << "类别:";
switch (animal.m_type) {
case Mammal:
cout << "哺乳动物" << endl;
break;
case Reptile:
cout << "爬行动物" << endl;
break;
case Amphibian:
cout << "两栖动物" << endl;
break;
case Bird:
cout << "鸟类" << endl;
break;
}
cout << "产地:" << animal.m_origin << endl;
cout << "体重:" << CAnimal::s_weight << "千克" << endl;
}
int main() {
// 定义10个实例
CAnimal animal1("熊猫", { 2020, 1, 1 }, Mammal, "中国");
CAnimal animal2("金钱豹", { 2019, 2, 15 }, Mammal, "非洲");
CAnimal animal3("蟒蛇", { 2020, 5, 1 }, Reptile, "南美洲");
CAnimal animal4("巨蜥", { 2019, 9, 10 }, Reptile, "澳大利亚");
CAnimal animal5("青蛙", { 2020, 3, 8 }, Amphibian, "北美洲");
CAnimal animal6("蝾螈", { 2019, 12, 25 }, Amphibian, "欧洲");
CAnimal animal7("秃鹫", { 2020, 6, 18 }, Bird, "南非");
CAnimal animal8("白鹤", { 2019, 11, 2 }, Bird, "中国");
CAnimal animal9("犀鸟", { 2020, 4, 21 }, Bird, "南美洲");
CAnimal animal10("孔雀", { 2019, 8, 17 }, Bird, "印度");
// 输出每个实例的信息
animal1.ShowInfo();
cout << endl;
animal2.ShowInfo();
cout << endl;
animal3.ShowInfo();
cout << endl;
animal4.ShowInfo();
cout << endl;
animal5.ShowInfo();
cout << endl;
animal6.ShowInfo();
cout << endl;
animal7.ShowInfo();
cout << endl;
animal8.ShowInfo();
cout << endl;
animal9.ShowInfo();
cout << endl;
animal10.ShowInfo();
cout << endl;
// 统计动物数量、体重和年龄
CAnimal::s_weight = 100;
CAnimal::s_totalWeight += animal1.s_weight + animal2.s_weight + animal3.s_weight
+ animal4.s_weight + animal5.s_weight + animal6.s_weight
+ animal7.s_weight + animal8.s_weight + animal9.s_weight + animal10.s_weight;
CAnimal::s_animalCount[Mammal] += 2;
CAnimal::s_animalCount[Reptile] += 2;
CAnimal::s_animalCount[Amphibian] += 2;
CAnimal::s_animalCount[Bird] += 4;
CAnimal::s_animalWeight[Mammal] += animal1.s_weight + animal2.s_weight;
CAnimal::s_animalWeight[Reptile] += animal3.s_weight + animal4.s_weight;
CAnimal::s_animalWeight[Amphibian] += animal5.s_weight + animal6.s_weight;
CAnimal::s_animalWeight[Bird] += animal7.s_weight + animal8.s_weight + animal9.s_weight + animal10.s_weight;
// 输出统计信息
cout << "哺乳动物数量:" << CAnimal::s_animalCount[Mammal] << endl;
cout << "爬行动物数量:" << CAnimal::s_animalCount[Reptile] << endl;
cout << "两栖动物数量:" << CAnimal::s_animalCount[Amphibian] << endl;
cout << "鸟类数量:" << CAnimal::s_animalCount[Bird] << endl;
cout << "哺乳动物总体重:" << CAnimal::s_animalWeight[Mammal] << "千克" << endl;
cout << "爬行动物总体重:" << CAnimal::s_animalWeight[Reptile] << "千克" << endl;
cout << "两栖动物总体重:" << CAnimal::s_animalWeight[Amphibian] << "千克" << endl;
cout << "鸟类总体重:" << CAnimal::s_animalWeight[Bird] << "千克" << endl;
cout << "所有动物总体重:" << CAnimal::s_totalWeight << "千克" << endl;
return 0;
}
```
输出结果:
```
名称:熊猫
出生日期:2020年1月1日
类别:哺乳动物
产地:中国
体重:100千克
名称:金钱豹
出生日期:2019年2月15日
类别:哺乳动物
产地:非洲
体重:100千克
名称:蟒蛇
出生日期:2020年5月1日
类别:爬行动物
产地:南美洲
体重:100千克
名称:巨蜥
出生日期:2019年9月10日
类别:爬行动物
产地:澳大利亚
体重:100千克
名称:青蛙
出生日期:2020年3月8日
类别:两栖动物
产地:北美洲
体重:100千克
名称:蝾螈
出生日期:2019年12月25日
类别:两栖动物
产地:欧洲
体重:100千克
名称:秃鹫
出生日期:2020年6月18日
类别:鸟类
产地:南非
体重:100千克
名称:白鹤
出生日期:2019年11月2日
类别:鸟类
产地:中国
体重:100千克
名称:犀鸟
出生日期:2020年4月21日
类别:鸟类
产地:南美洲
体重:100千克
名称:孔雀
出生日期:2019年8月17日
类别:鸟类
产地:印度
体重:100千克
哺乳动物数量:2
爬行动物数量:2
两栖动物数量:2
鸟类数量:4
哺乳动物总体重:200千克
爬行动物总体重:200千克
两栖动物总体重:200千克
鸟类总体重:400千克
所有动物总体重:1000千克
```
C++中如何限制变量的取值范围
在C++中,可以采用几种方法来限制变量的取值范围:
1. **枚举类型**(Enums):你可以创建一个枚举类型,其中包含所有允许的整数值。例如:
```cpp
enum class Color { RED = 0, GREEN, BLUE };
Color myColor;
```
`myColor`只能取`RED`, `GREEN`, 或`BLUE`这三种值。
2. **常量指针/引用**:对于数值类型的变量,可以声明一个指向特定范围内的常量,如整数数组的指针:
```cpp
const int LIMITS[] = {0, 100};
int limitedValue(LIMITS); // 限定在0到100之间
```
3. **预处理器宏**:虽然不是直接限制造成变量改变,但可以定义一组宏来检查值是否在合理范围内:
```cpp
#define MIN_VALUE 0
#define MAX_VALUE 100
#define CHECK_LIMIT(val) assert(val >= MIN_VALUE && val <= MAX_VALUE)
int value;
CHECK_LIMIT(value);
```
但这种方法不够安全,因为`assert`在运行时失败才会中断程序。
4. **智能指针(如std::unique_ptr)**:如果需要管理资源并且希望在超出指定范围时抛出异常,可以使用这类容器来间接控制。
需要注意的是,对于非整型数据类型,C++本身的机制并不提供这种直接的约束。如果你需要更严格的范围控制,可能需要配合外部库或者编写自定义验证函数。
阅读全文