我在此代码中遇到问题。我希望vfunc是公共的,所以VI_Smooth中的任何函数都可以使用相同的实例,同时我无法启动vfunc实例,因为我还没有命令!新命令给我错误的结果,我无法更改vfunc类的代码,并且没有operator = to vfunc。
我的问题是我想在VI_Smooth中使用相同名称的Object vfunc,而不是使用在vfunc类中包含命令的constructort启动一个新名称
#include <vfunc.h>
class VI_Smooth
{
public:
const char* filename;
Layers _layers;
vfunc VF;
int nPts;
VI_Smooth()
{
// ...
int commands = 0;
VF = vfunc(commands); // here is my problem
}
// ...
};
class vfunc
{
vfunc()
{
// ...
}
vfunc(int commands)
{
// ...
}
// ...
}
答案 0 :(得分:1)
您需要提前声明vfunc
课程,例如
class vfunc; // let the compiler know that vfunc exists
class VI_smooth
{
vfunc VF;
...
};
class vfunc
{
...
};
答案 1 :(得分:0)
我不确定我理解这个问题。如果问题是“如何在不使用关键字new
的情况下调用构造函数?”答案是:
vfunc vf;
如果问题是“我已经有一个vfunc
对象,并想清除它,我该如何调用它的构造函数?” (如标题所暗示的),答案是你不再调用构造函数,而是编写一个名为clear()
之类的函数,以便clear()
具有清除对象状态的效果。
然而,我认为问题实际上是“我有三个相互依赖的类,我无法找到一个好的顺序来定义类,以便我有类{的定义{1}}当我定义班级vfunc
时和在我定义班级Commands
时会有班级Commands
的定义。
答案是“你可以分割一个类的定义和声明,这是头文件的主要原因(将头部和定义中的声明放在一个单独的文件中)。但是相互依赖就像在你的问题中一样,在填写方法和另一方的成员之前,你还需要forward declare vfunc
或Commands
。如果你转发声明,那么你将拥有更改函数签名以获取引用或指针:
vfunc
前向声明有很多用途,最明显的是减少了编译时间(因为需要加载的头文件较少),而且还实现了PIMPL习惯用法和高效的平台相关代码(APR最后一次执行此操作)。