0

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

静态 vtkBorderCallback *New()

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

编译时出现错误:

/home/Desktop/test/src/ImageRegion.cpp:7:10: error: '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

4 回答 4

4

这个

static vtkBorderCallback *New();

是一个static名为 的成员函数New,不接受任何参数,并返回一个指向 的指针vtkBorderCallback

在实现中,您应该省略static. 您还需要将函数放在其类的范围内:

vtkBorderCallBack*  vtkBorderCallback::New()
{//                 ^^^^^^^^^^^^^^^^^^^
  return new vtkBorderCallback; // danger! Caller needs to delete this eventually
}
于 2013-09-04T11:00:51.113 回答
2

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

vtkStandardNewMacro(vtkBorderCallBack);

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

于 2013-09-05T14:41:51.353 回答
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_ptrs 是可移动的,但不可复制。但这就是必须防止泄漏的关键。当返回的指针New()遍布整个代码时,最好使用std::shared_ptr.

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

于 2013-09-04T11:10:26.723 回答
1

要解决错误,请在vtkBorderCallBack::前面放置New()

vtkBorderCallBack* vtkBorderCallBack::New()   
                   ~~~~~~~~~~~~~~~~~~~
{
   ...
}
于 2013-09-04T11:04:04.110 回答