在C++中,我最熟悉的语言,通常是一个声明这样的对象:
class foo
{
public:
int bar;
int getBar() { return bar; }
}
Run Code Online (Sandbox Code Playgroud)
调用getBar()工作正常(忽略bar可能未初始化的事实).内部的变量bar在getBar()类的范围内foo,所以我不需要说,this->bar除非我真的需要说清楚我指的是' bar而不是比如参数.
现在,我正试图在Javascript中开始使用OOP.所以,我查找如何定义类并尝试相同的事情:
function foo()
{
this.bar = 0;
this.getBar = function() { return bar; }
}
Run Code Online (Sandbox Code Playgroud)
它给了我bar is undefined.更改bar以this.bar解决问题,但为每个变量执行此操作会使我的代码变得非常混乱.这对每个变量都是必要的吗?由于我找不到与此有关的任何问题,这让我觉得我做的事情从根本上是错误的.
编辑:是的,所以,从评论我得到的是,this.bar一个对象的属性,引用不同于bar局部变量的东西.有人可以说,为什么这就是范围和对象,以及是否有另一种方法来定义一个没有必要的对象?
所以情况就是这样:我正在使用C++,SDL和GLConsole.我有一个类SDLGame,它有Init(),Loop(),Render()等-实际上,它适用于我的比赛类的逻辑.
到目前为止,GLConsole是一个不错的库 - 它允许我定义CVars等,甚至在我的SDL类中.但是,在定义命令时,我必须指定一个ConsoleFunctypedef为的命令
typedef bool (*ConsoleFunc)( std::vector<std::string> *args);
Run Code Online (Sandbox Code Playgroud)
很简单.但是,就像我说的,我的函数都在我的类中,我知道我不能将指向类的函数作为指针到函数的参数传递.我不能定义静态函数或在我的类之外创建函数,因为其中一些ConsoleFunc必须访问类数据成员才有用.我想保留OOP,因为 - 好吧,OOP很好.
好吧,我实际上已经解决了这个问题 - 但它非常难看.我只有一个SDLGame声明为extern变量的实例,并在我的ConsoleFuncs/main类中使用它.
所以,问题是:有没有办法做到这一点,就像我这样做一样不愚蠢和愚蠢?(或者:是否有像GLConsole这样支持SDL的控制台库,可以做我正在描述的内容?)
以下小程序在gcc上编译并运行正常:
#include <stdio.h>
#include <stdlib.h>
typedef struct foo dne;
int main(int argc, char *argv[]) {
dne *dne_var = malloc(sizeof(void*));
printf("%p\n", dne_var);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么typedef有效?