在 C++ 中,我试图将不同文件中的两个类放入同一个命名空间。
我在 main
中收到两个错误,指出类 Head
不在命名空间 Names
中,并且 days
未在此范围内声明。
似乎当我切换 #include
语句的顺序时,不起作用的类在两者之间翻转。据我所知,当包含第二个文件时命名空间应该再次打开,并将第二个类放入命名空间,但它不起作用。
为什么我包含哪个的顺序与哪个有效有关?我该怎么做才能使这两个类成为同一命名空间的一部分,同时将它们保存在单独的头文件中?
主要.cpp
#include <iostream>
#include "dy.hpp"
#include "dayyear.hpp"
int main(){
int d=2;
int y=5;
Names::Dy yup(y,d);
Names::Head days(y,d);
days.print();
yup.print();
return 0;
}
日年.hpp
#ifndef DY_H
#define DY_H
namespace Names{
class Head{
int year;
int day;
public:
Head();
Head(int y, int d);
void print();
void change(int y, int d);
};
}
#endif
日年.cpp
#include <iostream>
#include "dayyear.hpp"
Names::Head::Head(){
day=0;
year=0;
}
Names::Head::Head(int y, int d){
day=d;
year=y;
}
void Names::Head::print(){
std::cout<<day<<", "<<year<<std::endl;
}
void Names::Head::change(int y, int d){
year=y;
day=d;
}
dy.hpp
#ifndef DY_H
#define DY_H
namespace Names{
class Dy{
int year;
int day;
public:
Dy();
Dy(int y, int d);
void print();
void change(int y, int d);
};
}
#endif
dy.cpp
#include <iostream>
#include "dy.hpp"
Names::Dy::Dy(){
day=0;
year=0;
}
Names::Dy::Dy(int y, int d){
day=d;
year=y;
}
void Names::Dy::print(){
std::cout<<day<<", "<<year<<std::endl;
}
void Names::Dy::change(int y, int d){
year=y;
day=d;
}
最佳答案
那是因为 dayyear.hpp 和 dy.hpp 都有:
#ifndef DY_H
#define DY_H
.....
#endif
dayyear.hpp 应该有:
#ifndef DAYYEAR_H
#define DAYYEAR_H
.....
#endif
预处理器只考虑第一次出现相同的#infdef/#define/#endif
结构,所有后续的都被替换为空代码。这就是 #include
语句的顺序很重要的原因。
关于c++ - 试图将两个类放在同一个命名空间的不同文件中,但只有第一个 #included 类有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48913775/