为什么在这里宣布宣布的类agian?

时间:2017-07-22 08:28:49

标签: c++ class header

在一个项目中,在一个文件中," CalibHessian"已定义:

struct CalibHessian
{
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
    static int instanceCounter;

    VecC value_zero;
    VecC value_scaled;
    VecCf value_scaledf;
    VecCf value_scaledi;
    VecC value;
    VecC step;
    VecC step_backup;
    VecC value_backup;
    VecC value_minus_value_zero;

    inline ~CalibHessian() {instanceCounter--;}
    inline CalibHessian()
    {

        VecC initial_value = VecC::Zero();
        initial_value[0] = fxG[0];
        initial_value[1] = fyG[0];
        initial_value[2] = cxG[0];
        initial_value[3] = cyG[0];

        setValueScaled(initial_value);
        value_zero = value;
        value_minus_value_zero.setZero();

        instanceCounter++;
        for(int i=0;i<256;i++)
            Binv[i] = B[i] = i;     // set gamma function to identity
    };


    // normal mode: use the optimized parameters everywhere!
    inline float& fxl() {return value_scaledf[0];}
    inline float& fyl() {return value_scaledf[1];}
    inline float& cxl() {return value_scaledf[2];}
    inline float& cyl() {return value_scaledf[3];}
    inline float& fxli() {return value_scaledi[0];}
    inline float& fyli() {return value_scaledi[1];}
    inline float& cxli() {return value_scaledi[2];}
    inline float& cyli() {return value_scaledi[3];}
};

但在另一个名为&#34; CoarseInitializer.h&#34;的文件中,它显示为:

namespace dso
{
struct CalibHessian;
struct FrameHessian;
...
}

这对班级并没有什么新鲜事,而CalibHessian&#34;但只是重新宣布了它。它没有包含相应的标题。但是在文件&#34; CoarseInitializer.cpp&#34;现在它包括&#34; CalibHessian.h的标题&#34;。

我想知道这是重新宣布的必要吗?它用于什么?

2 个答案:

答案 0 :(得分:0)

第一个文件是CalibHessian的定义。头文件(CoarseInitializer.h)声明为CalibHessian

定义是确定名称行为方式的代码。声明只是名称存在的声明。您将声明放在头文件中,因为这就是告诉文件有关其他文件中是否存在名称的方法。

答案 1 :(得分:0)

前向声明是为了编译器。这似乎不是必要的,但是首选。

所以这个问题的答案不是必要的,而是为了取得成功。

感谢@Some程序员老兄的提示!