Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 声明成员函数时,*New()是什么意思?_C++_Class_Vtk - Fatal编程技术网

C++ 声明成员函数时,*New()是什么意思?

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

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

静态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;

};
//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
    }