【问题标题】:Please explain this expression请解释这个表达式
【发布时间】:2011-03-18 20:19:56
【问题描述】:
class TestPtr : protected QSharedPointer<Test>

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

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

【问题讨论】:

  • “我读到 QSharedpointer 是一个模板类。” - 呃,是the answer to your question
  • 这意味着 TestPtr 是从 QSharedPointer 以受保护的方式派生的,这有什么问题?你知道模板类是什么意思吗?

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


【解决方案1】:

不是什么意思

  1. TestPtr 派生自 Test -- 它不是。
  2. class Test 包含在一个智能指针中(但很接近:这意味着 instances of TestPtr 实际上将是指向 Test 的智能指针,除了作为TestPtr 的作者明确选择)

含义

这意味着TestPtr 想要实现指向Test 的智能指针的功能(这就是QSharedPointer&lt;Test&gt; 是什么——请注意我不知道QSharedPointer 到底做了什么,我只是”阅读名称中的内容”)。

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

然而,作者计划 TestPtr 等同于 QSharedPointer&lt;TestPtr&gt;,即使该类具有大致相同的功能(我们不知道给定的原因信息)。这就是为什么继承不是public

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      没有。 TestPtr 派生自 QSharedPointer

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

      是的。相反,QSharedPointer&lt;Test&gt; 是管理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.
      }
      

      【讨论】:

        【解决方案4】:

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

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

        从名字上看,QSharedpointer 是一个智能指针,但是我对这个类不熟悉,无法回答。

        在受保护的继承方面,您可能需要查看以下内容

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

        【讨论】:

          【解决方案5】:

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

          class QSharedPointer&lt;Test&gt;

          实际上是 QSharedPointer 类,用类 Test 表示。

          类 QSharedPointer 是一个模板类,这意味着一个类被编写一次,然后可以用于 Test 或其他类。

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

          template <class T>
            class Vector
              {
              };
          

          然后你可以拥有这个向量类的实例,它存储不同事物的向量。例如,Vector&lt;int&gt; 是一个存储整数的类,Vector&lt;bool&gt; 是另一个存储布尔值的类。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-07-16
            • 2010-09-27
            • 2012-01-13
            • 2013-04-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多