Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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++ 使用指向对象的void*指针的安全性_C++_Oop_Pointers - Fatal编程技术网

C++ 使用指向对象的void*指针的安全性

C++ 使用指向对象的void*指针的安全性,c++,oop,pointers,C++,Oop,Pointers,说来话长: 目前,我被分配去处理一个遗留的C项目,该项目需要更新以与新的相机设备集成。设备制造商提供的API非常简单,我所需要的只是将它们的头文件和lib包含到我的类中,以便使用设备,下面的示例代码片段如下: MyClass.h 但生活总是给你柠檬。每当我#将MyClass.h包含到主项目中时。编译器抛出类似如下的错误: ... /usr/include/c++/4.8/bits/stl_algobase.h:193:5: note: template<class _Tp> con

说来话长:

目前,我被分配去处理一个遗留的C项目,该项目需要更新以与新的相机设备集成。设备制造商提供的API非常简单,我所需要的只是将它们的头文件和lib包含到我的类中,以便使用设备,下面的示例代码片段如下:

MyClass.h

但生活总是给你柠檬。每当我
#将MyClass.h
包含到主项目中时。编译器抛出类似如下的错误:

...
/usr/include/c++/4.8/bits/stl_algobase.h:193:5: note: template<class  _Tp> const _Tp& std::min(const _Tp&, const _Tp&)
...
MyClass.cpp


是的,我不能使用智能指针,因为我的项目在C99上,我几乎没有在C/C++中使用指针的经验,我的工作环境安全吗?还有其他不使用原始指针的解决方法吗?

这确实不安全,也不需要

正确的解决方案是转发声明:

MyClass.h


说你的项目在C99上是没有意义的<代码>公共:是C++上的赠品。这意味着您可以使用智能指针,例如
boost::shared\u ptr
。每个版本的C++都支持它们,但是C(甚至C11)都没有版本。

< P>这确实不安全,也不需要。 正确的解决方案是转发声明:

MyClass.h


说你的项目在C99上是没有意义的<代码>公共:是C++上的赠品。这意味着您可以使用智能指针,例如
boost::shared\u ptr
。每一个C++版本都支持它们,但是C(甚至C11)都没有它们。

你的代码看起来是C++,并且不合法。C,你的变量定义应该在.CPP中,而不是头文件。另外,myDevice和myPtr不应该是成员变量而不是全局变量吗?您关心的是安全的哪些特定方面?简单地泄漏内存或使用void指针放弃类型安全性?至于是否调用析构函数,您不能自己测试吗?可能您正在使用
,并且忘记定义
NOMINMAX
。总是这样做。我喜欢我的类是用C++编写的,而大多数写在主项目上的代码在C.很重,写的人在主项目头中定义了一些类似MI/MAX的宏…为了方便,当我使用C++头的时候,编译器会显示我之前提到的错误。是的,使变量成为成员变量使生活更轻松。只是想知道,如果我应该使用这样的空洞指针来访问类之外的对象吗?你的代码看起来是C++,并且不是合法的C。你的变量定义应该在.CPP中,而不是头文件。另外,myDevice和myPtr不应该是成员变量而不是全局变量吗?您关心的是安全的哪些特定方面?简单地泄漏内存或使用void指针放弃类型安全性?至于是否调用析构函数,您不能自己测试吗?可能您正在使用
,并且忘记定义
NOMINMAX
。总是这样做。我喜欢我的类是用C++编写的,而大多数写在主项目上的代码在C.很重,写的人在主项目头中定义了一些类似MI/MAX的宏…为了方便,当我使用C++头的时候,编译器会显示我之前提到的错误。是的,使变量成为成员变量使生活更轻松。只是想知道,我是否应该使用像这样的void*指针来访问类外的对象?
#include "MyClass.h"
...
myDevice.GetInfo();
myPtr.GetFrame();
..ect.
...
/usr/include/c++/4.8/bits/stl_algobase.h:193:5: note: template<class  _Tp> const _Tp& std::min(const _Tp&, const _Tp&)
...
typedef void* DeviceHandle_t;
typedef void* FrameHandle_t;

public:
DeviceHandle_t myDevice;
FrameHandle_t myPtr;
#include <XFactory.h> //to avoid main project include this header
MyClass::MyClass(){
   myDevice = new XFactory::device();
   myPtr = new XFactory::xSmartPtr();
}

MyClass::~MyClass(){
   if (myDevice != NULL){
      delete (XFactory::device*)myDevice; //this will call class's destructor, won't it?
      myDevice = NULL;
   }

   if (myDevice != NULL){
      delete (XFactory::xSmartPtr*)myPtr ; //this will call class's destructor, won't it?
      myPtr = NULL;
   }       
}
((XFactory::device*)myDevice)->GetInfo();
((XFactory::xSmartPtr*)myPtr)->GetFrame();
class DeviceHandle;
class FrameHandle;

public:
DeviceHandle* myDevice;
FrameHandle* myPtr;