我有两个类A
和B
,其中类B
的样子
B.h
class B
{
public:
B();
virtual ~B();
void eval(int a, int b);
private:
A* APointer;
};
相应地我有
B.cpp
B::B():APointer(NULL){}
B::~B(){}
void B::eval(int a, int b)
{
if a == b
{
APointer->run(); // run() is a public method defined in class A
}
}
那么A类就像:
A.h
#include "LuaBridge.h"
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
using namespace luabridge;
class LuaParser
{
public:
LuaParser(lua_State* L);
virtual ~LuaParser();
void run();
private:
LuaRef mRun;
LuaRef mStop;
lua_State* mL;
};
和
A.cpp
LuaParser::LuaParser(lua_State* L) :mRun(L),mStop(L),mL(L) {}
LuaParser::~LuaParser(){}
void LuaParser::run(){
std::cout<<"This project runs!"<<std::endl;
}
系统很复杂,实际上我在类C
成员函数中称呼此eval函数。在该类中,我通过B* BPointer
在构造函数中定义了一个私有成员BPointer C(B* BPointer = NULL)
,然后BPointer->eval(a,b)
在类C成员函数中使用了它。
在我的main
代码,我定义B类像一个指针B* BPointer
,我使用该指针调用该方法B::eval
通过
BPointer -> eval(a, b);
但是,当我在Visual Studio中逐步运行它时,在命令行上APointer->run();
我注意到this
指针就像:
Value: 0xcdcdcdcd{APointer=???}
当我尝试运行此命令时,出现了一个错误:
Access violation reading location 0xCDCDCDD1.
好吧...我不知道如何解决这个问题,我想知道的是:
整个想法(即使用私有对象在此类方法中调用另一个类的函数)是否可行?
如果这个想法可行,那么我应该如何修改我的代码?
任何建议或想法都将受到欢迎!
整个想法(即使用私有对象在此类方法中调用另一个类的函数)是否可行?
是的,这很普遍。
如果这个想法可行,那么我应该如何修改我的代码?
您需要了解对象和指针之间的区别。指针是可能甚至未分配的存储区域的地址。
您在这里拥有的两个指针不指向任何已分配的内存,因此不存在您可以调用其方法的对象。
BPointer
是统一的,它包含随机存储器区域的地址(或0xcdcdcdcd
调试版本中的幻数),该地址可能只包含属于您或不属于您的任何内容。取消引用它是未定义的行为。为了避免这种情况,您应该创建B
对象并将其指针分配给BPointer
:
B *BPointer = new B;
使用完后BPointer
,您应该释放内存并B
通过调用来调用的析构函数
delete BPointer;
APointer
用NULL
指针初始化,这意味着它没有指向任何内存区域。取消引用NULL
也是未定义的行为。与相似BPointer
,应使用有效的对象指针对其进行初始化,然后再发布:
B::B() : APointer(new A(/* lua state pointer */ NULL)) {}
B::~B() { delete APointer; }
如果您不一定需要一个指针,建议您使用堆栈分配B
并将其存储A
为普通成员(而不是指针)。这样,您就不必担心指针的初始化和删除。
h
class B
{
public:
B();
void eval(int a, int b);
private:
A AObject;
};
丙型肝炎
B::B() : AObject(/* lua state pointer */ NULL) {}
void B::eval(int a, int b)
{
if (a == b)
{
AObject.run();
}
}
main.cpp
// ...
B b;
b.eval()
// ...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句