C++ 类的每个实例的自定义函数(C+;+;)

C++ 类的每个实例的自定义函数(C+;+;),c++,function,scripting,C++,Function,Scripting,我有一门课“EngineObject” 我想为该类提供一个自定义函数,该函数可能因该对象的实例而异 现在,我使用函数指针来实现它,如下所示: class EngineObject{ public: bool (*Update)(EngineObject* Me); bool (*Prep)(EngineObject* Me); bool (*OnCollide)(EngineObject* Me, EngineObject* Them); }; 正如你可能已经注

我有一门课“EngineObject”

我想为该类提供一个自定义函数,该函数可能因该对象的实例而异

现在,我使用函数指针来实现它,如下所示:

class EngineObject{
    public:
    bool (*Update)(EngineObject* Me);
    bool (*Prep)(EngineObject* Me);
    bool (*OnCollide)(EngineObject* Me, EngineObject* Them);
};
正如你可能已经注意到的,这需要我做一些非常残忍的事情。我必须将对象提供给它的成员函数。。。离题

它还要求我编写额外的getter和setter,我真的不想从代码的任何其他部分访问这些getter和setter,这样我就可以从通过函数指针传入的函数中看到EngineObject的“内部”

是否有某种方法可以编写一个函数,我可以在对象的每个实例上应用它,它可以访问对象的私有部分,而不必将对象传递给函数

为清楚起见: 假设我想要两个引擎对象

EngineObject1 = new EngineObject();
EngineObject2 = new EngineObject();
我想将更新函数1设置为(某物),2设置为(其他物)

我不能简单地使用虚拟函数和继承,因为这些函数需要能够在运行时被分配和重新分配

问题是,我需要从这些函数中访问private,为了做到这一点,我需要为所有内容编写公共getter和setter,这在某种程度上消除了将任何内容私有化的需要

背景:

我这样做的原因是允许在运行时无需内省就可以动态生成类型,最大限度地利用脚本接口,减少需要绑定到脚本接口的函数总数,并减少用户的学习曲线

基本上,您将拥有一个EngineObjectTemplate类,该类指定此动态生成类型的所有这些函数,然后使用EngineObjectTemplate类中的函数创建EngineObject

EngineObjectTemplates可以通过组合各种预编写的C++函数(更新、PREP、OnCulrDE)在运行时生成。这将是一种“类型”

如果用户希望编写新的update、prep或oncollide函数,他们可以选择将其写入并编译为DLL文件,然后将其添加到项目中(my EXE将读取该文件并将其添加到函数指针列表中,该函数指针可由脚本语言中的字符串名称引用,以分配给模板和/或EngineObject),或者他们可以用我选择的脚本语言编写脚本,当然速度会慢一些


我这样做的另一个原因是,我希望避免继承,因为让继承的类与我计划使用的脚本包装器一起工作是非常困难的。

您想要做的是不可能的,因为您实际上要求的是:

“我如何让类外的代码访问私有成员”

如果这是可能的,而不需要跳出一些丑陋、丑陋的圈圈,那么这就意味着
private
被打破了

访问类的私有成员的唯一方法是,该类显式地允许您从其接口访问它们,或者将代码标记为
友元
,作为其声明的一部分

成员要么是私人的,要么不是。你不能两全其美


注意:这是一个谎言,因为在某些特殊情况下,您可以使用一些技巧,但这些技巧只能作为最后的手段。

您可以创建一个可调用的对象类来覆盖
()
操作符。基类将为可替换函数作为参数接收的内容提供模板,子类实现该特定方法。然后将可调用类声明为所属类的
朋友
。例如:

class EngineObject;
class Callable;

class EngineObject
{
private:
  int member;
  Callable *func;

public:
  EngineObject(int m, Callable *f) : member(m), func(f) {}

  int Call(int p)
  {
    return func(p);
  }

  friend Callable;
};

class Callable;
{
public:
  int operator(EngineObject *eo, int param)
  {
    eo->member = param;
    return param;
  }
};

在上面,我还将变量函数调用隐藏在包装器后面,这样外部函数就不需要将对象作为参数传递。

在您的文本中很难找到这个问题。你应该编辑它使实际问题更明显。你考虑使用吗?即
std::函数更新。在构造函数中设置函数指针怎么样?例如,
EngineObject1=新的EngineObject(&foo)
private
用于阻止对不属于类的任何代码的访问,或阻止由
friend
显式带来的任何代码的访问。外部编写的回调必须符合“外部”代码的条件,允许它访问私有成员将破坏封装,这比添加访问器要糟糕得多。有些背景不错,但我建议对您拥有的代码和您想要编写的代码做一个简短的示例。顺便说一句,这个概念听起来非常不安全。这就像是一扇为黑客敞开的大门。这可能比我现在所做的更丑陋。似乎符合这里的定义3:我读错了吗?相反。EngineObject必须将Callable标记为friend。啊。。。更正。
class EngineObject;
class Callable;

class EngineObject
{
private:
  int member;
  Callable *func;

public:
  EngineObject(int m, Callable *f) : member(m), func(f) {}

  int Call(int p)
  {
    return func(p);
  }

  friend Callable;
};

class Callable;
{
public:
  int operator(EngineObject *eo, int param)
  {
    eo->member = param;
    return param;
  }
};