C++ 语法澄清
我浏览了一些Ubuntu的Mir示例,偶然发现了一些我无法理解的代码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
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的常规主体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++标准库定义的希望这能有所帮助。你让我意识到这个问题还不够清楚,谢谢你的快速回答,我将对其进行编辑。我不知道你是否想提及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
{