Пожалуйста, объясните это выражение - PullRequest
1 голос
/ 18 марта 2011
class TestPtr : protected QSharedPointer<Test>

где Test - абстрактный класс интерфейса. Класс TestPtr должен служить классом интеллектуального указателя.

Означает ли это, что класс TestPtr является производным от класса Test? Тест класса заключен в умный указатель? Я прочитал, что QSharedPointer является шаблоном класса. Может кто-нибудь уточнить, пожалуйста?

Ответы [ 5 ]

3 голосов
/ 18 марта 2011

Что это не значит

  1. То, что TestPtr происходит от Test - это не так.
  2. То, что class Test заключено в умный указатель (но близко: это означает, что экземпляры TestPtr будут фактически умными указателями на Test, не сообщая об этом миру, кроме как автор TestPtr явно выбирает)

Что это значит

Это означает, что TestPtr хочет реализовать функциональность умного указателя на Test (что и есть QSharedPointer<Test> - обратите внимание, я понятия не имею, что именно делает QSharedPointer, я просто " читая, что в имени ").

Чтобы достичь этого, автор TestPtr планирует широко использовать функциональность, встроенную во внутренние работы QSharedPointer (поэтому TestPtr наследуется вместо наличия QSharedPointer члена - чтобы иметь возможность использовать protected членов QSharedPointer).

Тем не менее, автор планирует, что TestPtr до не будет эквивалентно QSharedPointer<TestPtr>, даже если класс обладает примерно одинаковыми функциями (мы не знаем причину этого с данной информацией ). Вот почему наследование не public.

3 голосов
/ 18 марта 2011

TestPtr является производным от конкретной версии класса шаблона QSharedPointer, для которой был создан экземпляр класса Test в качестве параметра шаблона.

1 голос
/ 18 марта 2011

Означает ли это, что класс 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.
}
0 голосов
/ 18 марта 2011

Нет, класс TestPtr НЕ является производным от класса Test. Класс TestPtr наследуется от

class QSharedPointer<Test>

, который действительно является классом QSharedPointer, выраженным в терминах класса Test.

Класс QSharedPointer - это шаблонный класс, который означает класс, который записывается один раз, но затем может использоваться для Test или других классов.

Например, аналогично классу QSharedPointer, у вас может быть такой класс:

template <class T>
  class Vector
    {
    };

Тогда вы можете иметь экземпляры этого векторного класса, в котором хранятся векторы разных вещей. Например, Vector<int> - это один класс, в котором хранятся целые числа, а Vector<bool> - это другой класс, в котором хранятся логические значения.

0 голосов
/ 18 марта 2011

QSharedPointer - это шаблонный класс, а Test - это то, что он шаблонирует.

TestPtr наследуется от QSharedPointer (не Test - если QSharedPointer не наследует от Test - недостаточно информации в вопросе, чтобы ответить на этот вопрос, но это возможно).

Из названия это звучит так, как будто QSharedpointer - это умный указатель, но я не знаком с этим классом, чтобы иметь возможность отвечать.

Что касается защищенного наследования, вы можете посмотреть на следующее

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

...