向现有变量/对象启动新构造函数

时间:2011-08-13 08:36:37

标签: c++

我在此代码中遇到问题。我希望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)
    {
        // ...
    }

    // ...
}

2 个答案:

答案 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 vfuncCommands。如果你转发声明,那么你将拥有更改函数签名以获取引用或指针:

vfunc

前向声明有很多用途,最明显的是减少了编译时间(因为需要加载的头文件较少),而且还实现了PIMPL习惯用法和高效的平台相关代码(APR最后一次执行此操作)。