2016-10-17 10 views
0

Рассмотрим следующий объект с 1 членной переменной и 2 конструкторами.Шаблоны проектирования для создания объектов со свойствами, которые могут быть const или не const

MyObject { 
    const [or not] HasAnotherObject *m_pOtherObject; 

    MyObject(HasAnotherObject *pOtherObject); 
    MyObject(const HasAnotherObject *pOtherObject); 
} 

Я хочу создать экземпляр не const и const MyObject. Переменная-член также должна иметь тот же статус константы, что и локальная переменная.

MyObject myObjectVolatile(HasAnotherObject *pOtherObject); 
const MyObject myObjectConst(const HasAnotherObject *pOtherObject); 

Однако шаблон класса должен указывать статус const, не соответствующий методу создания экземпляра.

Есть ли шаблон дизайна, который может здесь помочь?

+0

'propagate_const'? –

+0

В настоящее время я использую это решение: переменных один Неконстантный член: 'HasAnotherObject * m_pOtherObject' и 2 методы: Const HasAnotherObject hasAnotherObject() {} константный и HasAnotherObject hasAnotherObject() {} и 2 конструкторы с сопзЬ и не -const. Константа должна сделать неприятное преобразование для удаления const. –

+0

привет Никки! благодаря! Я искал propate_const. понял. это решение использует шаблоны C++, которые являются одной из вещей, которые я рассматривал. это добавляет значительную сложность в определение класса. но поддерживает чистую и правильную реализацию. это будет еще один вариантом использования шаблонов непосредственно я хотел бы предложить: Const MyObject () Проблемы есть, конечно, что вы всегда должны соответствовать шаблону с локальными переменными Устами. –

ответ

0

внешнее предложение: один Неконстантный переменной члена:

HasAnotherObject *m_pOtherObject 

и 2 методы:

const HasAnotherObject hasAnotherObject() const {return m_pOtherObject;} 
HasAnotherObject hasAnotherObject() {return m_pOtherObject;} 

и 2 конструкторы:

MyObject(HasAnotherObject *pOtherObject): m_pOtherObject(pOtherObject) {} 
MyObject(const HasAnotherObject *pOtherObject): m_pOtherObject((HasAnotherObject *) pOtherObject) {} 

с сопзЬ и неконстантным опции. Const конструктор должен сделать неприятное преобразование для удаления Конст

0

В C++ const является частью типа переменной - поэтому вы могли бы задали тот же вопрос с int и double. И ответ на оба вопроса будет теперь, нет шаблона дизайна или языка, чтобы делать то, что вы хотите. В противном случае тип MyObject был бы неравным ему, а «фактический тип» был бы задан только его экземпляром. Это должно быть крайне нежелательным поведением.

Таким образом, вы (i) должны либо полагаться на шаблоны классов (которые вы исключили, по-видимому, потому, что хотите хранить объекты в MyObject в контейнере). (ii) Или вы должны использовать вариант (это кажется лучшей альтернативой мне). (iii) Или напечатайте тип HasAnotherObject. (iv) Или, аналогично, вы можете использовать наследование. (v) или, возможно, использовать дополнительные альтернативы, но все они будут иметь свои недостатки.

+0

согласился. Я бы сказал, что у const есть различия. например: int returnMyMemberVariable() –

+0

согласен! 'INT returnMyMemberVariable() и длинные returnMyMemberVariable()' и 'Const вещь returnMyMemberVariable() Const и вещь returnMyMemberVariable()' являются интересно другое. во втором примере статус const локального указателя влияет на метод vtable, который выполняется на указанном объекте. что не помогает нам с тем фактом, что вы правильно указали, что эти 2 объекта с различным статусом констант переменных-членов ДОЛЖНЫ быть двумя разными классами. Или используйте шаблоны каким-то образом, как propagate_const –

+0

@AnnesleyNewholm: afaik 'propagate_const' не помогает здесь, так как он решает проблему, которую члены класса' const' могут вызывать неконстантные члены pointee. Если вы хотите указать здесь, я бы предложил просто отказаться от 'const' перед' HasAnotherObject * '. Вместо этого сделайте его частным членом и соответствующим образом рассмотрите его в функциях вашего класса. Идея заключается в том, что переменные 'const' могут иметь меньшую полезность (- почему вы ограничиваете себя?). Скорее сделайте это неконстантным и будьте осторожны при обращении. – davidhigh