2015-10-05 50 views
0

请看看我以前的帖子在这里:问题与循环依赖,即使分开定义之后

Undefined type error even with forward declaration

我感动的定义,cpp文件,我仍然面对的课题。任何想法为什么?我的文件是这样的:

Header1.hpp

#ifndef HEADER1_HPP 
#define HEADER1_HPP 

namespace sample_ns 
{ 
    class sample_class{ 
    public: 
     static int getNumber(); 
     static void print();  
    }; 
} 
#endif 

Header2.hpp

#ifndef HEADER2_HPP 
#define HEADER2_HPP 
namespace sample_ns 
{ 
    class sample_class2{ 
    public: 
     sample_class2(); 
     int getNumber2(); 
    }; 
} 

#endif 

Source1.cpp

#include "Header1.hpp" 
#include "Header2.hpp" 
#include "stdafx.h" 
#include <iostream> 
namespace sample_ns 
{ 
     int sample_class::getNumber() 
     { 
      sample_class2 obj; 
      return obj.getNumber2(); 
     } 
     void sample_class::print() 
     { 
      std::cout << "Print utility function" << std::endl; 
     } 
} 

Source2.cpp

#include "Header2.hpp" 
#include "Header1.hpp" 
#include "stdafx.h" 
#include <iostream> 
namespace sample_ns 
{ 
     sample_class2::sample_class2() 
     { 
      sample_class::print(); 
     } 
     int sample_class2::getNumber2() 
     { 
      sample_class::print(); 
      return 5; 
     } 
} 

在我主我叫它为:

std::cout << sample_ns::sample_class::getNumber() << std::endl; 

我得到 'sample_class2':未声明的标识符。我尝试添加class sample_class2;但仍然给我的错误

编辑: 我的主要文件:

#include "stdafx.h" 
#include <iostream> 
#include "Header1.hpp" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::cout << "hello" << std::endl; 
    std::cout << sample_ns::sample_class::getNumber() << std::endl; 

    return 0; 
} 
+1

main.cpp是什么样子的? – NathanOliver

+0

我认为你应该在cpp文件中使用“using namespace sample_ns”,而不是在该命名空间中定义函数。这可能不会解决问题,但它是很好的风格。 – GeneralFailure

+0

它适用于我... –

回答

0

的使用结构声明类和命名空间中的标题和CPP文件的最佳做法如下喜欢:

Header1.hpp

#ifndef HEADER1_HPP 
#define HEADER1_HPP 
#include "Header2.hpp" 
#include <iostream> 

namespace sample_ns 
{ 
    class sample_class{ 
    public: 
     static int getNumber(); 
     static void print();  
    }; 
} 
#endif 

Source1.cpp

#include "Header1.hpp" 
namespace sample_ns 
{ 
     int sample_class::getNumber() 
     { 
      sample_class2 obj; 
      return obj.getNumber2(); 
     } 
     void sample_class::print() 
     { 
      std::cout << "Print utility function" << std::endl; 
     } 
} 

所以通过包含在头文件中并使用ifndef可以确保循环依赖不会发生。

+3

'stdafx.h'不属于头文件,头文件包含它们自己。 –

+0

您在Header1.hpp – NathanOliver

+0

中递归地包含Header1.hpp我不认为这是问题,如果我从两个源文件中取出stdafx.h并将条目更改为int main()或int main(int argc,char arg []) – Zebrafish