我是C ++的新手,并且通过flightgear源代码涉猎。我知道您可以限制指针的type,如此
CRectangle * prect; //prect is a pointer that must point to an object of type CRectangle
我也明白你可以引用namespace中的变量,如下所示:
cout << first::var << endl; //prints value of var in namespace = first
cout << second::var << endl; //prints value of var in namespace = second
话虽如此,我试图理解flightgear代码库中的这一行代码:
FGKeyboardInput * FGKeyboardInput::keyboardInput = NULL;
好像它正在创建一个名为keyboardInput的指针,类型为FGKeyboardInput。但我对keyboardinput之前的命名空间声明做了什么感到困惑。是否将变量键盘输入声明为命名空间FGKeyboardInput的一部分?在链接的命名空间教程中,通过将变量包含在命名空间括号中,将变量声明为某个命名空间的一部分。上面的代码是不是像这样的简写?
namespace FGKeyboardInput
{
FGKeyboardInput * keyboardInput = NULL;
}
答案 0 :(得分:8)
在C ++中,符号名称具有范围和可见性。如果在命名空间中定义数据类型,则符号名称仅在该命名空间中可见。为了能够在当前范围中使用该符号名称,您需要导入该符号名称。有很多方法可以做到这一点:
namespaceName::symbolName
或所以当你使用:
cout << first::var << endl;
这意味着引用位于命名空间var
中的first
。请注意,它也可能意味着引用var
,它位于类\ structure ,如果 它是静态成员。
如上所述,
FGKeyboardInput * FGKeyboardInput::keyboardInput = NULL;
似乎是在名为keyboardInput
的类\结构中定义名为FGKeyboardInput
的静态数据成员指针,它是指向类型FGKeyboardInput
的指针。
答案 1 :(得分:3)
我也明白你可以在命名空间中放一个变量,如:
这不是你在命名空间中放置变量的方式,而是将引用到已经放在命名空间中的变量的方式。
好像它正在创建一个名为keyboardInput的指针,类型为FGKeyboardInput。
右。
但是我对于keyboardinput之前的命名空间声明做了什么感到困惑。是否将变量键盘输入声明为命名空间FGKeyboardInput?
的一部分
没有。这不是任何事情的声明,::
之前的名称是范围,可能是命名空间,但在这种情况下它不是。您已经确定FGKeyboardInput
是一种类型,类型名称可以是范围。您正在查看的是静态数据成员的定义,其声明如下:
class FGKeyboardInput
{
public:
static FGKeyboardInput* keyboardinput;
};
它定义了一个类FGKeyboardInput
,并声明了类keyboardinput
的静态数据成员。必须在程序中的某个位置定义静态数据成员,如下所示:
FGKeyboardInput * FGKeyboardInput::keyboardInput = NULL;
在这种情况下,FGKeyboardInput::
部分引用在FGKeyboardInput
类范围内声明的内容。您使用类似的语法来定义在类中声明的成员函数:
class Foo
{
public:
int func(); // declare member function
};
int Foo::func() // define member function
{
// ...
}
要定义成员函数,您必须使用其所属类的名称对其进行限定,即Foo::func
。
上面的代码是不是像这样的东西?
不,没有这样的简写,要声明命名空间的成员你必须打开命名空间并在里面声明成员,你不能使用::
运算符添加到范围,你只能参考已经在该范围内宣布的事情。