在C ++中,我试图将两个类放在相同的命名空间中。
我在main
中收到两个错误,说类Head
不在命名空间Names
中,并且days
未在此范围内声明。
似乎当我切换#include
语句的顺序时,不工作的类在两者之间触发。根据我的阅读,当包含第二个文件时,命名空间应该再次打开,并将第二个类放入命名空间,但它不起作用。
为什么我所包含的关于哪个有效的顺序?我可以做些什么来使两个类成为同一名称空间的一部分,同时将它们保存在单独的头文件中?
的main.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;
}
dayyear.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
dayyear.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;
}
答案 0 :(得分:1)
这是因为dayyear.hpp和dy.hpp都有:
#ifndef DY_H
#define DY_H
.....
#endif
dayyear.hpp应该有:
#ifndef DAYYEAR_H
#define DAYYEAR_H
.....
#endif
预处理器仅考虑同一#infdef/#define/#endif
构造的第一个外观,所有后续构造都用空代码替换。这就是为什么#include
陈述的顺序很重要的原因。