c++ - 试图将两个类放在同一个命名空间的不同文件中,但只有第一个 #included 类有效

标签 c++ class namespaces

在 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/

相关文章:

php - 创建具有可变类名和命名空间的对象

c++ - 复杂数据类型 vector 的迭代器

c# - 从当前方法 C# 向下调用方法 2 类

c++ - C++ 类的私有(private)成员和 protected 成员有什么区别?

java - 子接口(interface)指向父接口(interface)实现类

ruby-on-rails - Rails 路由范围/命名空间问题

c++ - 海峡删除();在函数内部不起作用

c++ - itoa 会删除字符吗?

c++ - 如何在位集中存储随机生成的无符号整数

c# - .NET 单个类的多个命名空间