声明成员函数时* New()的含义是什么?

时间:2013-09-04 10:59:23

标签: c++ class vtk

我正在研究一个VTK程序,并找到了一个类(特别是这个:Image Region),我需要将其合并到我的代码中。为此,我创建了一个单独的ImageRegion.h和ImageRegion.cpp文件,以便它们可以轻松地包含在项目中。

是我的问题
  

static vtkBorderCallback * New()

我不知道如何在.cpp文件中实现的函数,或者说实话,它的用途是什么。它有什么作用?是否有必要拥有它?

编译时我收到错误:

  

/home/Desktop/test/src/ImageRegion.cpp:7:10:错误:'vtkBorderCallback :: vtkBorderCallback'命名构造函数,而不是类型

我的.h文件:

//ImageRegion.h
#pragma once

#include <vtkSmartPointer.h>
#include <vtkActor.h>
#include <vtkAssemblyNode.h>
#include <vtkAssemblyPath.h>
#include <vtkBorderRepresentation.h>
#include <vtkCommand.h>
#include <vtkCoordinate.h>
#include <vtkImageMapper3D.h>
#include <vtkImageActor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkPolyData.h>
#include <vtkPropPicker.h>
#include <vtkProperty2D.h>
#include <vtkBorderWidget.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>

class vtkBorderCallback : public vtkCommand
{
public:
  vtkBorderCallback();
  static vtkBorderCallback *New();
  virtual void Execute(vtkObject *caller, unsigned long, void*);
  void SetRenderer(vtkSmartPointer<vtkRenderer> ren);
  void SetImageActor(vtkSmartPointer<vtkImageActor> im);
  double coords[6];



private:
  vtkSmartPointer<vtkRenderer> Renderer;
  vtkSmartPointer<vtkImageActor> ImageActor;

};

我的.cpp文件:

//ImageRegion.cpp
#include "ImageRegion.h"


  vtkBorderCallback::vtkBorderCallback(){}


  static vtkBorderCallback::vtkBorderCallback* New()   
    {
    return new vtkBorderCallback;
    }

  void vtkBorderCallback::Execute(vtkObject *caller, unsigned long, void*)
    {
      //Do stuff, from original VTK example code
    }

  void vtkBorderCallback::SetRenderer(vtkSmartPointer<vtkRenderer> ren) {this->Renderer = ren;}
  void vtkBorderCallback::SetImageActor(vtkSmartPointer<vtkImageActor> im) {this->ImageActor = im;}

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:4)

static vtkBorderCallback *New();

是名为static的{​​{1}}成员函数,不带任何参数,并返回指向New的指针。

在实施中,您应该省略vtkBorderCallback。您还需要将该函数放在其类的范围内:

static

答案 1 :(得分:2)

在VTK中,几乎所有类都派生自vtkObjectBase。他们应该使用New()和Delete()来创建和删除对象(构造函数和析构函数受到保护)。这些方法包括引用计数以确保它们在可能使用它们的其他vtkObject之间正确共享。有一个VTK宏(vtkStandardNewMacro)负责New()的实现,基类实现Delete()。因此对于VTK,实现静态New()方法的最佳方法是使用该宏。对于名为vtkBorderCallBack的类,它看起来像:

  

vtkStandardNewMacro(vtkBorderCallBack);

这应该放在您的.cpp文件中。

答案 2 :(得分:1)

要解决错误,请将vtkBorderCallBack::放在New()之前:

vtkBorderCallBack* vtkBorderCallBack::New()   
                   ~~~~~~~~~~~~~~~~~~~
{
   ...
}

答案 3 :(得分:1)

他不应该忽略static,因为New()是构造函数。在这种情况下,我宁愿期望真正的构造函数为private。实施

 static vtkBorderCallback::vtkBorderCallBack* New()   
    {
    return new vtkBorderCallback;
    }

在语法上是错误的。它是如此

 vtkBorderCallBack* vtkBorderCallback::New()   
    {
    return new vtkBorderCallback;
    }

最后整个方法很奇怪。这里并不真正需要New(),并且可能导致内存泄漏。要在每个类的基础上建立特定于类的内存管理重载操作符newdelete。或者,为了防止泄漏,请不要返回原始指针;返回std::auto_ptr(已弃用)或std::unique_ptr

 std::unique_ptr<vtkBorderCallBack> vtkBorderCallback::New()   
    {
    return std::unique_ptr<vtkBorderCallBack>(new vtkBorderCallback); // uses move c'tor
    }

但是,std::unique_ptr是可移动但不可复制的。但这是必须防止泄漏的关键。当New()返回的指针在整个代码中传播时,最好使用std::shared_ptr

如果您只有C ++ 03编译器,我推荐Herb Sutter的Using auto_ptr Effectively