试图将两个类放在同一命名空间中的单独文件中,但只有#1个#Class类作品

Trying to put two classes in separate files in the same namespace, but only the first #included class works

本文关键字:文件 单独 #Class 两个 命名空间      更新时间:2023-10-16

在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;  
}

那是因为dayyear.hpp和dy.hpp都有:

#ifndef DY_H
#define DY_H
.....
#endif

dayyear.hpp应该有:

#ifndef DAYYEAR_H
#define DAYYEAR_H
.....
#endif

预处理器仅考虑同一#infdef/#define/#endif构造的首次出现,所有后续构造都用空代码替换。这就是为什么#include语句的顺序很重要。