Пожалуйста, объясните это выражение

class TestPtr : protected QSharedPointer<Test>

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

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


person Vij    schedule 18.03.2011    source источник
comment
Я читал, что QSharedpointer — это класс шаблонов. — это, хм, ответ на ваш вопрос.   -  person BlueRaja - Danny Pflughoeft    schedule 18.03.2011
comment
Это означает, что TestPtr является производным от QSharedPointer‹Test› защищенным способом, в чем проблема? Вы знаете, что означает класс шаблона?   -  person Tamer Shlash    schedule 18.03.2011


Ответы (5)


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

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

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

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

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

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

person Jon    schedule 18.03.2011

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

person Null Set    schedule 18.03.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.
}
person outis    schedule 18.03.2011

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

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

Судя по названию, QSharedpointer — это умный указатель, но я не знаком с этим классом, чтобы ответить.

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

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

person Tom    schedule 18.03.2011

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

class QSharedPointer<Test>

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

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

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

template <class T>
  class Vector
    {
    };

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

person Kharina Tigerfish    schedule 18.03.2011