即使在分离定义之后也存在循环依赖问题

时间:2015-10-05 18:49:56

标签: c++ circular-dependency

请在此处查看我之前的帖子:

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;

我得到&#39; sample_class2&#39; :未声明的标识符。我尝试添加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 个答案:

答案 0 :(得分:0)

在header和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,您可以确保不会发生循环依赖。