我正在研究一个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;}
非常感谢任何帮助。
答案 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()
,并且可能导致内存泄漏。要在每个类的基础上建立特定于类的内存管理重载操作符new
和delete
。或者,为了防止泄漏,请不要返回原始指针;返回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。