C++ 声明成员函数时,*New()是什么意思?
我正在开发一个VTK程序,发现了一个类(特别是这个:),我需要将它合并到我的代码中。为此,我创建了一个单独的ImageRegion.h和ImageRegion.cpp文件,以便它们可以轻松地包含在项目中。我这里的问题是 静态vtkBorderCallback*New() 我不知道如何在.cpp文件中实现的函数,或者说实话,它到底有什么用途。它有什么作用?甚至有必要拥有它吗 编译时,我得到一个错误: /home/Desktop/test/src/ImageRegion.cpp:7:10:错误:“vtkBorderCallback::vtkBorderCallback”命名构造函数,而不是类型 我的.h文件:C++ 声明成员函数时,*New()是什么意思?,c++,class,vtk,C++,Class,Vtk,我正在开发一个VTK程序,发现了一个类(特别是这个:),我需要将它合并到我的代码中。为此,我创建了一个单独的ImageRegion.h和ImageRegion.cpp文件,以便它们可以轻松地包含在项目中。我这里的问题是 静态vtkBorderCallback*New() 我不知道如何在.cpp文件中实现的函数,或者说实话,它到底有什么用途。它有什么作用?甚至有必要拥有它吗 编译时,我得到一个错误: /home/Desktop/test/src/ImageRegion.cpp:7:10:错误:“v
//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;
};
//ImageRegion.h
#布拉格语一次
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
类vtkBorderCallback:公共vtkCommand
{
公众:
vtkBorderCallback();
静态vtkBorderCallback*New();
虚拟void Execute(vtkObject*调用者,无符号长,void*);
void SetRenderer(vtksmartren);
void SetImageActor(vtksmart指针im);
双坐标[6];
私人:
vtksmart指针渲染器;
vtksmart;
};
和我的.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;}
//ImageRegion.cpp
#包括“ImageRegion.h”
vtkBorderCallback::vtkBorderCallback(){}
静态vtkBorderCallback::vtkBorderCallback*New()
{
返回新的vtkBorderCallback;
}
void vtkBorderCallback::Execute(vtkObject*调用者,无符号长,void*)
{
//做一些事情,从原始的VTK示例代码
}
void vtkBorderCallback::SetRenderer(vtkSmartPointer ren){this->Renderer=ren;}
void vtkBorderCallback::SetImageActor(vtkSmartPointer im){this->ImageActor=im;}
非常感谢您的帮助。
static vtkBorderCallback *New();
是名为New
的静态
成员函数,不带任何参数,并返回指向vtkBorderCallback
的指针
在实现中,应该省略静态
。您还需要将函数置于其类的作用域中:
vtkBorderCallBack* vtkBorderCallback::New()
{// ^^^^^^^^^^^^^^^^^^^
return new vtkBorderCallback; // danger! Caller needs to delete this eventually
}
要解决此错误,请将
vtkBorderCallBack::
放在New()之前。
:
他不应该省略
static
,因为New()
意味着构造函数。在这个场景中,我更希望真正的构造函数是private
。实施
static vtkBorderCallback::vtkBorderCallBack* New()
{
return new vtkBorderCallback;
}
在语法上是错误的。事情就是这样
vtkBorderCallBack* vtkBorderCallback::New()
{
return new vtkBorderCallback;
}
最后,整个方法很奇怪<这里实际上不需要code>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\u ptr vtkBorderCallback::New()
{
return std::unique_ptr(new vtkBorderCallback);//使用移动命令
}
但是,std::unique_ptr
s是可移动的,但不可复制。但这正是必须防止泄漏的关键。当New()
返回的指针分布在整个代码中时,最好使用std::shared\u ptr
如果您只有一个C++03编译器,我建议您使用Herb Sutter的。在VTK中,几乎所有的类都派生自vtkObjectBase。他们应该使用New()和Delete()来创建和删除对象(构造函数和析构函数受到保护)。这些方法包括引用计数,以确保它们在可能使用它们的其他VTK对象之间正确共享。有一个VTK宏(vtkStandardNewMacro)负责New()的实现,基类实现Delete()。因此,对于VTK,实现静态New()方法的最佳方法是使用该宏。对于名为vtkBorderCallBack的类,它将如下所示: vtkStandardNewMacro(vtkBorderCallBack)
这应该在.cpP文件中。
我应该如何在IMAGErEGION.CPP文件中正确实现它?@ USER(C++)。我添加了一个例子。我也觉得有点奇怪,但是我没有做很多C++编程,所以我不知道这是正确的或错误的方式。只要它在原始示例代码中工作,我想它就足够了。在定义中,不需要<代码>静态< /代码>,只在声明中。我不确定使用VTK的C++智能指针会很好。VTK代码+VTK宏(实际上是一个宏来实现新的),希望它自己的智能指针和返回类型是SeMeTkObjt*,而不是C++智能指针。我相信你还必须包含在*.CPP文件中:这个头包括:“VTKObjutsP.h”//用于new()宏 std::unique_ptr<vtkBorderCallBack> vtkBorderCallback::New()
{
return std::unique_ptr<vtkBorderCallBack>(new vtkBorderCallback); // uses move c'tor
}