2015-10-05 54 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