1
class TestPtr : protected QSharedPointer<Test>

ここTestで、抽象インターフェイス クラスです。このTestPtrクラスは、スマート ポインター クラスとして機能する必要があります。

これは classTestPtrが class から派生したということTestですか? クラス テストはスマート ポインターで囲まれていますか? QSharedPointerそれはテンプレートクラスだと読みました。誰か明確にしてくれませんか?

4

5 に答える 5

3

それが意味しないこと

  1. それTestPtrはから派生しますTest-そうではありません。
  2. これclass Testはスマート ポインターで囲まれています (ただし、これは、 の作成者が明示的に選択した場合を除き、 のインスタンス TestPtrが実際にスマート ポインターになることを意味し、そのTestことを世界に知らせることはありません)TestPtr

その意味

これはTestPtr、スマート ポインターの機能を実装する必要があることを意味しますTest(つまり、何をするQSharedPointer<Test>のか正確にはわからないことに注意してくださいQSharedPointer。「名前の内容を読んでいるだけです」)。

これを達成するために、 の作成者はTestPtr、 の内部作業に組み込まれた機能を広範囲に使用することを計画していますQSharedPointer(そのため、 はメンバーTestPtrを持つ代わりに継承し、 のメンバーQSharedPointerを使用できるようになります)。protectedQSharedPointer

ただし、著者は、クラスがほぼ同じ機能を持っていても、 はa と同等ではないTestPtrことを計画しています (与えられた情報では、この理由はわかりません)。そのため、継承はありません。QSharedPointer<TestPtr>public

于 2011-03-18T20:32:02.407 に答える
3

TestPtrクラスをテンプレート パラメータとしてQSharedPointerインスタンス化されたテンプレート クラスの特定のバージョンから派生します。Test

于 2011-03-18T20:30:12.570 に答える
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メンバーはbyとその子孫QSharedPointerでのみアクセス可能であることを意味します。オーバーライドせず、 (または への参照)を取るコンストラクターがあるとします。次に、アクセス制限により、次のことが失敗します。TestPtrTestPtrTestPtroperator *TestTest

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

    *pbar; // Error: QSharedPointer<Test>::operator *() is protected within this context.
}
于 2011-03-18T20:38:18.930 に答える
0

いいえ、クラス TestPtr はクラス Test から派生したものではありません。クラス TestPtr はから派生します

class QSharedPointer<Test>

これは実際にはクラス QSharedPointer であり、クラス Test で表されます。

クラス QSharedPointer はテンプレート クラスです。これは、一度作成されたクラスを意味し、その後テストや他のクラスに使用できます。

たとえば、クラス QSharedPointer と同様に、次のようなクラスを作成できます。

template <class T>
  class Vector
    {
    };

次に、さまざまなもののベクトルを格納するこのベクトル クラスのインスタンスを持つことができます。たとえばVector<int>、int を格納する 1 つのクラスと、Vector<bool>ブール値を格納する別のクラスです。

于 2011-03-18T20:31:15.343 に答える
0

QSharedPointer はテンプレート クラスであり、Test はそれがテンプレート化するものです。

TestPtr は QSharedPointer から継承します (Test ではありません - QSharedPointer が Test から継承しない限り、質問にはこれに答えるのに十分な情報がありませんが、可能です)。

名前からすると QSharedpointer はスマート ポインターのように聞こえますが、私はこのクラスに詳しくなく、答えることができません。

保護された継承に関しては、次を参照してください。

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

于 2011-03-18T20:30:26.170 に答える