尝试将两个类放在同一名称空间中的单独文件中,但只有第一个#included类才有效

时间:2018-02-21 19:17:38

标签: c++ class namespaces

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

1 个答案:

答案 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陈述的顺序很重要的原因。