C - 可以在标题之外声明类功能
C++ - Can Class Functions be Declared Outside of Header?
我是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文件中使用函数之前仅定义它们来做到这一点。无需在标题文件中定义它们,因为没有必要使它们成为成员功能。这些只是免费功能。
另外,您可能要将它们放在匿名名称空间中,因此仅在现有文件中可见它们。
- 对可变参数使用声明.如何选择正确的功能
- 在气泡排序程序中未声明错误功能
- 引用 using 声明引入的功能的句子是什么意思?
- 朋友功能声明中的错误C
- 抽象类 A 由类 C 继承"through"类 B "intermediary"。如何声明虚拟功能?
- 如何实现声明功能-C 11,编译时间
- 如何使用C 中的元编程声明多功能
- 如何声明功能接受rvalue的任意长度阵列
- C |声明类外部功能
- 您可以声明会员功能并使他们做不同的事情吗?
- Forward宣布了Singleton班级,并带有Freshial声明的朋友功能
- 打印功能的地址..声明
- 如何将指针声明以在类初始化器中的成员功能并拨打这些指针
- 功能未在范围(GLFW,OpenGL,Slackware)中声明
- C 1Z标准如何定义模板功能声明中属性的正确位置
- 从模板参数中声明功能指针中的模板类中
- 在C 中多次声明功能和变量
- 没有模板就无法声明C 功能
- 在定义模板后声明功能
- 如何声明功能向量(lambdas)