我有这堂课:
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(){}
有一些括号打开但括号内没有任何内容。我的问题是为什么?
哪个范围有括号?
答案 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(){}
这也声明了一个空的析构函数,并且不包含任何代码。
但在这种情况下,这是有原因的。与构造函数一样,如果完全省略析构函数,编译器将提供默认的析构函数。
但是这个声明做了一些事情:它声明了一个虚拟的析构函数。
在这种情况下,所需的所有类都是虚拟析构函数。虚析构函数不需要做任何明确的事情,因此它的内容是空的。但是,该类需要一个虚拟析构函数,因此必须声明它。