2011-03-18 58 views
1
class TestPtr : protected QSharedPointer<Test> 

其中Test是一个抽象接口类。 TestPtr类应该作为智能指针类。请解释此表达式

这是表示类TestPtr是从类Test派生?类测试是否包含在智能指针中? 我读过QSharedPointer是模板类。有人可以澄清吗?

+1

*“我读了QSharedpointer是一个模板类。” * - 那,呃,是[回答您的问题(HTTP:// WWW。 cplusplus.com/doc/tutorial/templates/)。 – 2011-03-18 20:24:36

+0

这意味着TestPtr是以受保护的方式从QSharedPointer 派生的,那有什么问题?你知道模板类是什么意思吗? – 2011-03-18 20:30:55

回答

3

什么,这并不意味着

  1. TestPtrTest派生 - 事实并非如此。
  2. class Test被封闭在一个智能指针(但接近:它意味着TestPtr情况下,实际上是智能指针,以Test而不让世界了解它除了作为TestPtr笔者明确选择)

这意味着什么

这意味着TestPtr希望实现一个智能指针的功能Test(这是什么QSharedPointer<Test>是 - 请注意我不知道QSharedPointer究竟是什么,我只是“读名字里面的东西”)。

为了实现这一点,TestPtr计划广泛使用内置的QSharedPointer内作品的功能作者(这就是为什么TestPtr继承而不是有QSharedPointer成员 - 以能够使用的QSharedPointerprotected成员)。

然而,TestPtr笔者的计划不相当于一个QSharedPointer<TestPtr>即使类具有大致相同的功能(我们不知道用给定的信息这样做的原因)。这就是为什么继承不是public

3

TestPtr从模板类别QSharedPointer的特定版本派生,该类别已经以类别Test作为其模板参数实例化。

0

QSharedPointer是一个模板类,Test是它的模板。

TestPtr从QSharedPointer继承(不是测试 - 除非QSharedPointer继承自Test--没有足够的信息来回答这个问题,但它可能)。

从名字看来,QSharedpointer是一个聪明的指针,但我不熟悉这个类能够回答。

在保护传承方面,你可能想看看下面的

http://www.parashift.com/c++-faq-lite/private-inheritance.html

0

没有,类TestPtr不是从Test类的。类TestPtr并获得来自

class QSharedPointer<Test>

这是真的类QSharedPointer,在课堂测试表示。

QSharedPointer类是一个模板类,它意味着一次写入但可以用于Test或其他类的类。

例如,类似于类QSharedPointer,你可以有这样一类:

template <class T> 
    class Vector 
    { 
    }; 

然后,您可以有存储不同的东西载体中,这种载体类的实例。例如Vector<int>是存储整数的一个类,并且Vector<bool>是存储布尔值的不同类。

1

这是否意味着类TestPtr是从类Test派生的?

No. TestPtr源自QSharedPointer

在智能指针中是否包含类测试?

是的。相反,QSharedPointer<Test>是智能指针类,管理Test指针。

我读到QSharedpointer是一个模板类。有人可以澄清吗?

模板抽象出类似于函数如何将操作抽象出来的类型。例如,

int i,j; 
... 
i = 2*i+1; 
j = 2*j+1; 

可以被抽象到:

void foo(int &x) { 
    x = 2*x + i; 
} 

... 
int i,j, 
... 
foo(i); 
foo(j); 

类似地,而不是单独的类如:

class IntSharedPtr { typedef int value_type; ... }; 
class FloatSharedPtr { typedef float value_type; ...}; 

你可以有一个模板类:

template <typename _T> 
class SharedPtr { typedef _T value_type; ...}; 

typedef SharedPtr<int> IntSharedPtr; 
typedef SharedPtr<float> FloatSharedPtr; 

最后,protected意味着QSharedPointer的成员只能在TestPtrTestPtr及其后代进行访问。假设TestPtr不会覆盖operator *并具有一个构造函数,其构造函数采用Test(或引用Test)。那么下面会失败,因为访问限制:

int main() { 
    Test bar; 
    TestPtr pbar(bar); 

    *pbar; // Error: QSharedPointer<Test>::operator *() is protected within this context. 
}