C++ 语法澄清

C++ 语法澄清,c++,ubuntu,syntax,C++,Ubuntu,Syntax,我浏览了一些Ubuntu的Mir示例,偶然发现了一些我无法理解的代码 struct DemoServerConfiguration : mir::DefaultServerConfiguration { 这里发生了什么“:mir::DefaultServerConfiguration” 在那个结构里面有这个 std::shared_ptr<msh::PlacementStrategy> the_shell_placement_strategy() { return shell

我浏览了一些Ubuntu的Mir示例,偶然发现了一些我无法理解的代码

struct DemoServerConfiguration : mir::DefaultServerConfiguration
{
这里发生了什么“:mir::DefaultServerConfiguration

在那个结构里面有这个

std::shared_ptr<msh::PlacementStrategy> the_shell_placement_strategy()
{
   return shell_placement_strategy(
   [this]
   {
      return std::make_shared<me::FullscreenPlacementStrategy>(the_display());
   });
}
再次在同一个结构中

std::initializer_list<std::shared_ptr<mi::EventFilter> const> the_event_filters() override
{
    return filter_list;
}
不明部分

(config, [&config, &wm](mir::DisplayServer&)
);
第一个例子 这只是从内部类型继承的一种情况:

class C
{
public:
    class Internal
    {
    };
};

class D : public C::Internal
{
    // D derives from Internal class, which is a member of C class
};
是作用域解析的运算符。表达式
A::B
的意思是:“B,它是A的一个成员”<代码>:适用于类、结构和名称空间

第二个例子 这有点复杂

std::shared_ptr<msh::PlacementStrategy> the_shell_placement_strategy()
{
   return shell_placement_strategy(
   [this]
   {
      return std::make_shared<me::FullscreenPlacementStrategy>(the_display());
   });
}
它返回调用
shell\u放置\u策略的结果

   [this]
   {
      return std::make_shared<me::FullscreenPlacementStrategy>(the_display());
   }
其中:

  • 访问规范
    定义lambda和局部变量之间的关系。例如,
    [a]
    意味着lambda将通过值访问局部变量
    a
    <代码>[&a]
-相同,但通过引用<代码>[&]-lambda将通过引用等方式访问所有局部变量
  • 参数
    -功能参数的常规定义
  • 主体
    -lambda的常规主体
  • lambda符号是
    C++11
    标准的一部分

    最后一个例子 您现在应该能够解释此示例:

    mir::run_mir(config, [&config, &wm](mir::DisplayServer&)
    {
        code
    });
    
    那就是:

    • 调用
      run\u mir
      方法(或函数),它是
      mir
      类(或命名空间)的一部分
    • 有两个参数:
      config
      和一个函数,该函数接受两个参数
    • config
      作为第一个参数传递
    • lambda由第二个参数传递
    现在兰姆达:

    • 它希望通过引用访问两个局部变量:
      config
      wm
    • 它接受一个mir::DisplayServer类型的参数&(这个参数没有名字,所以看起来它实际上并没有使用它)
    • 它确实是

      • 第一种情况是,它是私有继承
        DemoServerConfiguration
        源自
        mir::DefaultServerConfiguration
        ,其中mir可能是一个名称空间(但也可能是一个声明内部类
        DefaultServerConfiguration
        的类)

        第二种情况,您正在查看lambda表达式定义。您可以阅读一些介绍

        最后,初始化列表实际上是C++11标准中引入的另一个特性(大多数编译器AFAIK还不支持)

        这里的
        mir
        可以是一个
        命名空间
        或一个
        ,其中定义了
        DefaultServerConfiguration
        。例如,它可以是:

        namespace mir
        {
            class DefaultServerConfiguration 
            {
                 /*...*/ 
            };
        }
        
        或者这个,

        class mir
        {
         public:
            class DefaultServerConfiguration 
            {
                 /*...*/ 
            };
        }
        
        在这两种情况下,您都可以通过以下方式访问类
        DefaultServerConfiguration

        mir::DefaultServerConfiguration
        
        其他情况也是如此

        struct DemoServerConfiguration : mir::DefaultServerConfiguration
        {
        
        这里的
        DemoServerConfiguration
        是一个从
        mir::DefaultServerConfiguration
        派生的类。有意义吗

        您也注意到,在<代码> STD::MaMaMySudio中。这里“代码> STD<代码>是由C++标准库定义的命名空间< /代码>,其中库定义了代码> MaxySuffy函数模板。
        希望这能有所帮助。

        你让我意识到这个问题还不够清楚,谢谢你的快速回答,我将对其进行编辑。我不知道你是否想提及OP的示例1使用私有继承,这与您的示例中更常见的公共继承不同example@GuyGreer还有人提到过,那是结构默认继承。这可能不是私有继承的情况。最后一个例子是函数调用,不是定义。@ OkTalistRAPP,我的错误。当然,你修改了答案。第一个案例实际上是公共继承,因为这是默认的代码。Stutt。你读过C++书吗?除了奇怪的LA之外。即使是一个新的C++ 11,所有的其他的都是继承和模板类的教科书例子,如果你不知道这些术语,那么就需要一个以上的问题来提高你的速度。我建议你开始阅读。我在C++中确实很差,但在我看来,它是P。retty 75%的lambda特定语法,15%的参数化类型,其余的是用于内部继承的简写语法。例如,我认为是“教科书”的::不需要解释
        struct C:foo::Base
        是教科书继承(指某个作用域中的类
        Base
        ,或另一个类或命名空间)默认的是,<代码> >结构> <代码>默认继承,而<参数>类>默认为私下继承。对于参数化类型,这实际上是C++中的模板;语法可能会变得尴尬,但至少应该是FAMI。比如说,
        std::vector
        std::map
        的说谎者。你不需要拿出更多的证据来证明你的观点。我不是想让你相信我是我们两个中更好的程序员,我知道我不是:D我会读更多的书,变得更好,我只是想通过在这里接受同样重要的知识来变得更好顺便说一句,C++11中的最后一个“override”关键字也是新的:POh,我也不想证明任何东西,如果是这样的话,我当然要道歉(我恐怕我对英语的掌握介于初学者和初级之间)我只是想说服你打开C++书。问答很好回答快速问题,但我认为你似乎缺乏一些基本知识,而且这些方法更能用结构化的方法来教,如在好书和教程中可以找到的。
        [access-specification](parameters){ body }
        
        mir::run_mir(config, [&config, &wm](mir::DisplayServer&)
        {
            code
        });
        
        mir::DefaultServerConfiguration
        
        namespace mir
        {
            class DefaultServerConfiguration 
            {
                 /*...*/ 
            };
        }
        
        class mir
        {
         public:
            class DefaultServerConfiguration 
            {
                 /*...*/ 
            };
        }
        
        mir::DefaultServerConfiguration
        
        struct DemoServerConfiguration : mir::DefaultServerConfiguration
        {