一些括号的范围

时间:2016-06-16 02:43:59

标签: c++

我有这堂课:

class CNullDecorator: public CBaseDecorator, public CPooledObject<CNullDecorator>
{
public:
    CNullDecorator(){}
    virtual~CNullDecorator(){}

protected:
    virtual void __Excute(const CDecoratorData &d){}
    virtual CBaseDecorator *__Clone(CParticleInstance *, CParticleInstance *)
    {
        return new CNullDecorator;
    }
};

正如您所见,CNullDecorator(){}virtual~CNullDecorator(){}有一些括号打开但括号内没有任何内容。我的问题是为什么? 哪个范围有括号?

3 个答案:

答案 0 :(得分:1)

它们是无内容的内联函数。你可能有

2016-06-16 10:17:17.123 [main] DEBUG o.e.p.s./.sql - SELECT TENANT_ID AS a1, ID AS a2 FROM TESTMULTITENANTENTITY WHERE (TENANT_ID = ?) ORDER BY ID LIMIT ? OFFSET ?
    bind => [1, 3, 1]
entity-2
2016-06-16 10:17:17.159 [main] DEBUG o.e.p.s./.sql - SELECT t0.TENANT_ID, t0.ID, t0.NAME, t0.VALUE, t0.PID FROM TESTMULTITENANTENTITYLINE t0, TESTMULTITENANTENTITYLINE t1 WHERE ((((t1.TENANT_ID, t1.PID) IN ((?,?),(?,?),(?,?))) AND (t0.TENANT_ID = ?)) AND (t1.TENANT_ID = ?))
    bind => [1, 2, 1, 3, 1, 4, 1, 1]  **?????? Why TESTMULTITENANTENTITYLINE joins to itself t0/t1? This produce many duplicated records**
2016-06-16 10:17:17.227 [main] DEBUG o.e.p.s./.sql - SELECT TENANT_ID, ID FROM TESTMULTITENANTENTITY WHERE (((TENANT_ID = ?) AND (ID = ?)) AND (TENANT_ID = ?))
    bind => [1, 1, 1] **?????? I try to fetch record 2,3,4, why it fetch out 1, 5, 6?**
2016-06-16 10:17:17.267 [main] DEBUG o.e.p.s./.sql - SELECT TENANT_ID, ID FROM TESTMULTITENANTENTITY WHERE (((TENANT_ID = ?) AND (ID = ?)) AND (TENANT_ID = ?))
    bind => [1, 5, 1]
2016-06-16 10:17:17.295 [main] DEBUG o.e.p.s./.sql - SELECT TENANT_ID, ID FROM TESTMULTITENANTENTITY WHERE (((TENANT_ID = ?) AND (ID = ?)) AND (TENANT_ID = ?))
    bind => [1, 6, 1]
entityLine-2-1
entityLine-2-1
entityLine-2-1
entityLine-2-1
entityLine-2-1
entityLine-2-1
entityLine-2-1
entityLine-2-1
entityLine-2-1
entityLine-2-2
entityLine-2-2
entityLine-2-2
entityLine-2-2
entityLine-2-2
entityLine-2-2
entityLine-2-2
entityLine-2-2
entityLine-2-2
entityLine-2-3
entityLine-2-3
entityLine-2-3
entityLine-2-3
entityLine-2-3
entityLine-2-3
entityLine-2-3
entityLine-2-3
entityLine-2-3
entity-3
entityLine-3-1
entityLine-3-1
entityLine-3-1
entityLine-3-1
entityLine-3-1
entityLine-3-1
entityLine-3-1
entityLine-3-1
entityLine-3-1
entityLine-3-2
entityLine-3-2
entityLine-3-2
entityLine-3-2
entityLine-3-2
entityLine-3-2
entityLine-3-2
entityLine-3-2
entityLine-3-2
entityLine-3-3
entityLine-3-3
entityLine-3-3
entityLine-3-3
entityLine-3-3
entityLine-3-3
entityLine-3-3
entityLine-3-3
entityLine-3-3
entity-4
entityLine-4-1
entityLine-4-1
entityLine-4-1
entityLine-4-1
entityLine-4-1
entityLine-4-1
entityLine-4-1
entityLine-4-1
entityLine-4-1
entityLine-4-2
entityLine-4-2
entityLine-4-2
entityLine-4-2
entityLine-4-2
entityLine-4-2
entityLine-4-2
entityLine-4-2
entityLine-4-2
entityLine-4-3
entityLine-4-3
entityLine-4-3
entityLine-4-3
entityLine-4-3
entityLine-4-3
entityLine-4-3
entityLine-4-3
entityLine-4-3

并获得相同的效果。

答案 1 :(得分:0)

{ }定义了一个函数体。在您的情况下,这必然意味着CNullDecorator()(构造函数),~CNullDecorator()(析构函数)和__Excute()(受保护的方法)没有正文,即它们什么都不做。

编辑:(回答评论中提出的问题)

  

如果未使用CNullDecorator。或者构造函数或析构函数永远不会   使用和刚定义我可以删除吗?

构造函数和析构函数(以及其他一些东西)是C ++编译器默认提供的,以防程序员省略它们。在你的情况下,构造函数可以被删除,因为它什么都不做,但你所做的析构函数是virtual(虽然是空的),所以你必须保持它的行为方式符合它的预期。

有关虚拟析构函数here的更多信息。

答案 2 :(得分:0)

首先,它不是括号,而是括号。

所有范围都有大括号。但有些范围比其他范围更特殊。函数是整个范围。在这种情况下:

CNullDecorator(){}

这声明了一个空构造函数,一个没有代码的构造函数。通常,你会有一个构造函数做某事:

CNullDecorator()
{
     // Some code here. Initialize this to that. Call some other
     // function
}

假装括号内有代码。现在你有了一个典型的构造函数。但实际上没有任何东西要求你在构造函数中有任何代码。所以,如果你把它留下来,你将有一套空的支架。

这实际上没有任何用处。你可以完全省略构造函数,编译器很乐意为你提供它。这是一种风格问题。

另一方面,析构函数就是这样的原因:

virtual ~CNullDecorator(){}

这也声明了一个空的析构函数,并且不包含任何代码。

但在这种情况下,这是有原因的。与构造函数一样,如果完全省略析构函数,编译器将提供默认的析构函数。

但是这个声明做了一些事情:它声明了一个虚拟的析构函数。

在这种情况下,所需的所有类都是虚拟析构函数。虚析构函数不需要做任何明确的事情,因此它的内容是空的。但是,该类需要一个虚拟析构函数,因此必须声明它。