请解释这个表达方式

时间:2011-03-18 20:19:56

标签: c++ qt templates smart-pointers qsharedpointer

class TestPtr : protected QSharedPointer<Test>

其中Test是一个抽象接口类。 TestPtr类应该作为智能指针类。

这是否意味着类TestPtr派生自类Test?类测试是否包含在智能指针中?  我读到QSharedPointer是一个模板类。有人可以澄清一下吗?

5 个答案:

答案 0 :(得分:3)

TestPtr派生自模板类QSharedPointer的特定版本,该版本已使用类Test作为模板参数进行实例化。

答案 1 :(得分:3)

这并不意味着

  1. TestPtr来自Test - 它不是。
  2. class Test包含在智能指针中(但是关闭:这意味着 TestPtr实例实际上是Test的智能指针而不让它世界知道它,除了TestPtr的作者明确选择)
  3. 含义

    这意味着TestPtr想要实现指向Test的智能指针的功能(QSharedPointer<Test>就是这样 - 请注意我完全不知道QSharedPointer },我只是“阅读名字中的内容”。)

    为实现这一目标,TestPtr的作者计划广泛使用QSharedPointer内部作品中内置的功能(这就是TestPtr继承而不是QSharedPointer的原因成员 - 能够使用protected的{​​{1}}成员。

    但是,作者计划QSharedPointer等同于TestPtr,即使该类具有相同的功能(我们不知道原因是什么)这与给定的信息)。这就是继承不是QSharedPointer<TestPtr>的原因。

答案 2 :(得分:1)

  

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

没有。 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 TestPtr及其后代才能访问TestPtr的成员。假设TestPtr没有覆盖operator *并且有一个带Test(或引用Test)的构造函数。然后,由于访问限制,以下内容将失败:

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

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

答案 3 :(得分:0)

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

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

从名称来看,它听起来像QSharedpointer是一个智能指针,但我不熟悉这个类能够回答。

就受保护的继承而言,您可能需要查看以下内容

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

答案 4 :(得分:0)

不,类TestPtr不是从类Test派生的。 TestPtr类派生自

  

class QSharedPointer<Test>

这是真正的QSharedPointer类,用类Test表示。

类QSharedPointer是一个模板类,它表示一次编写但可用于测试或其他类的类。

例如,类似于QSharedPointer类,您可以拥有这样的类:

template <class T>
  class Vector
    {
    };

然后你可以拥有这个矢量类的实例来存储不同东西的矢量。例如,Vector<int>是一个存储整数的类,Vector<bool>是一个存储布尔值的不同类。