3

我是 C++ 的新手,并且涉足飞行设备源代码。我知道您可以像这样限制指针的类型

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

话虽如此,我试图理解飞行设备代码库中的这行代码:

FGKeyboardInput * FGKeyboardInput::keyboardInput = NULL;

似乎它正在创建一个名为keyboardInput 的FGKeyboardInput 类型的指针。但是我对键盘输入之前的命名空间声明的作用感到困惑。是否将变量键盘输入声明为命名空间 FGKeyboardInput 的一部分?在链接的命名空间教程中,您通过将变量包含在命名空间括号中来将其声明为某个命名空间的一部分。上面的代码是这样的简写吗?

namespace FGKeyboardInput
{
  FGKeyboardInput * keyboardInput = NULL;
}
4

2 回答 2

8

In C++ symbol names have a scope and a visibility. If you define a data type in a namespace then the symbol name is visible only in that namespace. To be able to use that symbol name in your current scope you need to import that symbol name. There are number of ways to do that:

So when you use:

cout << first::var << endl; 

It means refer to the var which resides in the namespace first. Note that it could also mean refer to var which resides in a class\structure if it is a static member.

Having said above,

FGKeyboardInput * FGKeyboardInput::keyboardInput = NULL;

Seems to be definition of a static data member pointer named keyboardInput inside the class\structure named FGKeyboardInput and it is pointer to the type FGKeyboardInput.

于 2013-09-14T15:12:05.620 回答
3

我也知道您可以将变量放在命名空间中,如下所示:

这不是您变量放入命名空间的方式,而是您引用已放入命名空间的变量的方式。

似乎它正在创建一个名为keyboardInput 的FGKeyboardInput 类型的指针。

正确的。

但是我对键盘输入之前的命名空间声明的作用感到困惑。是否将变量键盘输入声明为命名空间 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.

上面的代码是这样的简写吗?

不,没有这样的简写,要声明命名空间的成员,您必须打开命名空间并在其中声明成员,您不能使用::运算符将​​内容添加到范围,您只能引用已在该范围中声明的内容.

于 2013-09-14T15:46:47.323 回答