Bitte erklären Sie diesen Ausdruck
-
27-10-2019 - |
Frage
class TestPtr : protected QSharedPointer<Test>
wo Test
ist eine abstrakte Schnittstellenklasse. Das TestPtr
Die Klasse sollte als Smart Zeiger -Klasse dienen.
Bedeutet das Klasse? TestPtr
ist aus der Klasse abgeleitet Test
? Ist Klassentest in einem intelligenten Zeiger eingeschlossen? Ich habe das gelesen QSharedPointer
ist eine Vorlagenklasse. Könnte jemand bitte klarstellen?
Lösung
Was es nicht bedeutet
- Dass
TestPtr
kommt vonTest
-- Es tut nicht. - Dass
class Test
ist in einen intelligenten Zeiger eingeschlossen (aber in der Nähe: das bedeutet das Beispiele vonTestPtr
wird tatsächlich kluge Zeiger seinTest
ohne die Welt darüber zu informieren, außer als Autor vonTestPtr
entscheidet sich ausdrücklich dafür)
Was es bedeutet
Es bedeutet das TestPtr
will die Funktionalität eines intelligenten Zeigers auf implementieren Test
(welches ist was QSharedPointer<Test>
ist - bitte beachten Sie, ich habe keine Ahnung genau was QSharedPointer
Ich mache nur "das, was im Namen ist").
Um dies zu erreichen, der Autor von TestPtr
Pläne, die in die inneren Werke von eingebauten Funktionen ausführlich zu nutzen QSharedPointer
(deshalb TestPtr
Erben anstatt eine zu haben QSharedPointer
Mitglied - in der Lage sein, die zu verwenden protected
Mitglieder von QSharedPointer
).
Der Autor plant jedoch für TestPtr
zu nicht äquivalent zu a QSharedPointer<TestPtr>
Auch wenn die Klasse ungefähr die gleiche Funktionalität hat (wir kennen den Grund dafür nicht mit den angegebenen Informationen). Deshalb ist das Erbe nicht public
.
Andere Tipps
TestPtr
wird aus der jeweiligen Version der Vorlagenklasse abgeleitet QSharedPointer
das wurde mit der Klasse instanziiert Test
als Vorlageparameter.
Bedeutet dies, dass der KlassentestPTR aus dem Klassentest abgeleitet wird?
Nein. TestPtr
ist abgeleitet von QSharedPointer
.
Ist Klassentest in einem intelligenten Zeiger eingeschlossen?
Ja. Eher, QSharedPointer<Test>
ist eine kluge Zeigerklasse, die es verwaltet Test
Zeiger.
Ich habe gelesen, dass QsharedPointer eine Vorlagenklasse ist. Könnte jemand bitte klarstellen?
Templates abstrakten Typen, ähnlich wie die Funktionen abstrahierter Werte aus Operationen. Zum Beispiel,
int i,j;
...
i = 2*i+1;
j = 2*j+1;
kann abstrahiert werden zu:
void foo(int &x) {
x = 2*x + i;
}
...
int i,j,
...
foo(i);
foo(j);
In ähnlicher Weise, anstatt separate Klassen wie:
class IntSharedPtr { typedef int value_type; ... };
class FloatSharedPtr { typedef float value_type; ...};
Sie können eine Vorlagenklasse haben:
template <typename _T>
class SharedPtr { typedef _T value_type; ...};
typedef SharedPtr<int> IntSharedPtr;
typedef SharedPtr<float> FloatSharedPtr;
Endlich, das protected
bedeutet, dass Mitglieder von QSharedPointer
sind nur in a zugänglich TestPtr
durch TestPtr
und seine Nachkommen. Vermuten TestPtr
Überschreibt nicht operator *
und hat einen Konstruktor, der a nimmt Test
(oder Verweis auf a Test
). Dann würde das Folgende aufgrund von Zugriffsbeschränkungen fehlschlagen:
int main() {
Test bar;
TestPtr pbar(bar);
*pbar; // Error: QSharedPointer<Test>::operator *() is protected within this context.
}
QsharedPointer ist eine Vorlagenklasse, und Test ist das, was es vorlagen.
TestPTR erbt von QSHARDPOInter (nicht test - es sei denn, QSHARDPOINTER erbt vom Test - nicht genügend Informationen in der Frage, um dies zu beantworten, aber es möglich).
Aus dem Namen klingt es so, als ob QsharedPointer ein intelligenter Zeiger ist, aber ich bin mit dieser Klasse nicht vertraut, um zu antworten.
In Bezug auf die geschützte Erbschaft möchten Sie sich möglicherweise Folgendes ansehen
http://www.parashift.com/c+-faq-lite/private-inheritance.html
Nein, KlassentestPTR wird nicht aus dem Klassentest abgeleitet. Klasse testPtr leitet sich aus
class QSharedPointer<Test>
Das ist wirklich Klasse qSharedPointer, ausgedrückt in Bezug auf den Klassentest.
Klasse qSharedPointer ist eine Vorlagenklasse, dh eine Klasse, die einmal geschrieben wurde, dann aber für den Test oder andere Klassen verwendet werden kann.
Zum Beispiel könnten Sie ähnlich wie bei der Klasse QSHARDPOINTER eine solche Klasse haben:
template <class T>
class Vector
{
};
Sie könnten dann Instanzen dieser Vektorklasse haben, die Vektoren verschiedener Dinge speichert. Zum Beispiel Vector<int>
ist eine Klasse, die INTs speichert, und Vector<bool>
ist eine andere Klasse, die Booleane speichert.