我的问题的本质是:
在 ac 函数中创建新对象并将对该新对象的一些引用传递给调用者的最佳方法是什么?
我的整体设置有点复杂,涉及混合的 c 和 c++ 代码,所以我包括一些背景信息:
我正在为 3D 引擎创建一个 c++ 库。该库旨在用于不同平台上的主机应用程序。
出于简单的兼容性原因,我现在打算将所有 c++ 代码隐藏在纯 c 中的 API 后面。到目前为止,这工作得很好。
我唯一不确定的是,这是通过我的 c API实际创建引擎实例的最佳方式。
我的第一种方法是:
// in myEngineAPI.h
void myEngineCreate(void * myEngine);
void myEngineRelease(void * myEngine);
// in myEngineAPI.cpp
#include "myEngineAPI.h"
#include "myPrivateCppEngine.h"
void myEngineCreate(void * myEngine) {
myEngine = new Engine; // <- this doesn't seem to work as expected
}
void myEngineRelease(void * myEngine) {
delete ((Engine *)myEngine);
}
// in my host application
#include "myEngineAPI.h"
void * myEngine = NULL;
myEngineCreate(myEngine); // <- problem: myEngine is still NULL after this line.
// ...draw some fancy stuff...
myEngineRelease(myEngine);
我希望这myEngineCreate(void * myEngine)
会将我新创建的对象的地址分配给myEngine
. 但是函数返回后,myEngine
仍然指向NULL。为什么?
现在我的第二种方法是:
// in myEngineAPI.h
void * myEngineCreate();
void myEngineRelease(void * myEngine);
// in myEngineAPI.cpp
#include "myEngineAPI.h"
#include "myPrivateCppEngine.h"
void * myEngineCreate() {
return new Engine; // <- ok, the function returns a valid pointer
}
void myEngineRelease(void * myEngine) {
delete ((Engine *)myEngine);
}
// in my host application
#include "myEngineAPI.h"
void * myEngine = myEngineCreate(); // <- yay, I have a void pointer to my engine
// ...draw some fancy stuff...
myEngineRelease(myEngine);
这行得通。myEngineCreate()
给我一个指向我的引擎实例的不透明指针,我可以在随后的绘图调用中使用它,也可以将它交给我的释放函数,当我完成它时清理内存。这种方法的问题是,我的分析器抱怨myEngineCreate()
. 我知道在一个地方创建一个对象并在另一个地方拥有它是一件微妙的事情,我似乎在这里做错了什么 - 但是什么?
提前感谢您的任何建议或帮助。