C - 可以在标题之外声明类功能

C++ - Can Class Functions be Declared Outside of Header?

本文关键字:声明 功能 标题      更新时间:2023-10-16

我是C 的新手,试图编写目的的类是在使用输入实例化的类时解决数学问题。我已经在几个子功能上打破了这些计算,因此标题/源代码看起来像这样:

mysolver.h

#ifndef __mySolver_h__
class mySolver
{
private:
    double mInput, mOutput; //member variables
    double intermediateCalculation1(double input);
    double intermediateCalculation2(double intermediateValue1);
public:
    mySolver(double input);
};
#endif

mysolver.cpp

#include "mySolver.h"
mySolver::mySolver(double input)
{
    mInput = input;
    double intermediateValue1 = intermediateCalculation1(mInput);
    double mOutput = intermediateCalculation2(intermediateValue1);
    cout << "Output is: " << mOutput << endl;
 }
double mySolver::intermediateCalculation1(double input)
{
    //do stuff
}
double mySolver::intermediateCaluclation2(double intermediateValue1)
{
    //do stuff while accessing value of member variable mInput
}

这起作用,但是我必须在标题文件中列出intermediatecalculation1/2的方法,尽管它们纯粹是实现的详细信息。结果,如果我想更改如何执行计算的一些详细信息(例如将事物分为3个中间计算而不是2),我将不得不更改标头文件并重新编译每个包含mySolver.h的文件这似乎打败了将界面与实现分开的目的。

我的问题是:

1)是否有一种简单的方法可以执行此操作,而不必在标题文件中包含中间功能?

2)是否有一种简单的方法可以执行此操作,而不必在标题文件中包含中间函数仍然可以让我访问中间函数中的成员变量

我遇到了一些可能是解决方案的PIMPL技术的引用,但出于我的目的,这似乎是不必要的。

编辑:关于为什么这在课堂上,我为清晰简化了我的示例,但是在我的实际代码中,我有多个输出,其中一些是中间结果,我只想在某些时候访问某些时间(即出于错误检查),因此我选择的班级结构。

1)是否有一种简单的方法可以执行此操作,而不必在标题文件中包含中间功能?

是。除此答案外,如果将它们放入匿名(未命名)名称空间中,您将真正从翻译单元以外的任何访问中隐藏这些实现详细信息。它还有助于不要在名称冲突的情况下混淆链接器:

namespace { // <<<< unnamed namespace
    double intermediateCalculation1(double input) {
        //do stuff
    }
    double intermediateCaluclation2(double intermediateValue1, double input) {
        // the member variable mInput should be passed as parameter
    }
}
mySolver::mySolver(double input) {
    mInput = input;
    double intermediateValue1 = intermediateCalculation1(mInput);
    mOutput = intermediateCalculation2(intermediateValue1,mInput);
    cout << "Output is: " << mOutput << endl;
}

2)是否有一种简单的方法可以执行此操作,而不必在标题文件中包含中间功能,该功能仍然可以让我访问中间功能中的成员变量?

不是真的,这些需要被 friend ed才能这样做,这要求它们出现在类声明中。

您仍然可以选择该选项,因为您的代码示例现在确实可以通过,并传递了必要的参数,或者随您提到的 pimpl 习惯。由于 pimpl 只需要一个远期声明,我相信您也可以在匿名名称空间中执行完整的声明和定义。

您可以通过在.cpp文件中使用函数之前仅定义它们来做到这一点。无需在标题文件中定义它们,因为没有必要使它们成为成员功能。这些只是免费功能。

另外,您可能要将它们放在匿名名称空间中,因此仅在现有文件中可见它们。