2009-11-25 2 views
5

При просмотре одного из наших классов C++ с помощью покрытия он обнаружил сообщение об ошибке в определенном классе. Класс выглядит следующим образом:Идентификатор класса, используемый внутри декларации класса. Это хорошая практика?

class InputRecord 
{ 
    /* Construtor */ 
    ... 
    InputRecord::RejectRecord(); 
    ... 
    /* Destructor */ 
} 

Каково значение использования идентификатора внутри класса? Правильно ли это следовать этому?

Спасибо, Mathew Liju

ответ

5

В gcc-компиляторах (v4.1 и выше) это не скомпилировалось с ошибкой: дополнительная квалификация. Поэтому хорошей практикой не поместить его!

См. here, в котором рассматривается дополнительная квалификация как неконкурентная C++.

+0

не только gcc, любой компилятор, кроме визуальной студии. –

0

G'day,

Я всегда думал, что-то идентификатор используется только в реализации и не было необходимости в определении класса.

Объявление класса

class InputRecord; 

Что у вас есть определение класса.

class InputRecord 
{ 
    /* Construtor */ 
    ... 
    RejectRecord(); 
    ... 
    /* Destructor */ 
} 

затем в файле .cpp у вас есть реализация

InputRecord::RejectRecord() 
{ 
    ... 
} 
+0

Даже это мое понимание. Прежде чем принимать какое-либо решение об изменении программы, я просто хочу подтвердить свое понимание. В любом случае спасибо за ответ :-) –

0

В общем, нет никаких случаев, когда неоднозначности при условии явной InputRecord:: в вашем образце кода, вероятно, будет что-нибудь кроме избыточного.

Если код выполняет сложные манипуляции, когда конкретный класс является релевантным (скажем, вы передаете его базовому классу с теневой версией), это может помочь ясности кода, чтобы сделать его явным.

Это немного похоже на использование this-> (или this. в C#/Java).

Лично я удалю любые такие избыточные спецификаторы и найду другой способ получить точку.

+0

На самом деле, я думаю, что и C++, и Java должны заставить людей использовать это для переменных-членов, поэтому нам больше не нужно называть их mValue, m_value, m_Value, value_ и т. Д. –

+0

Мы должны назвать их 'm ...'? : P С точки зрения функционального программирования вы хотите, чтобы вас заставляли думать, прежде чем использовать состояние/В перспективе OO это будет «нормальным». Для некоторых типов вещей это выглядело бы «действительно» уродливо. Некоторые «стандарты» программирования говорят, что нет префикса, поскольку из кода должно быть ясно, является ли он членом или параметром, - это нормально, если вы пишете правильный код. (Я лично не использую венгерскую нотацию, но цепляюсь за префикс [с «_»], зная его неправильное. Я бы не хотел, чтобы префикс 'this.' повсюду). Я думаю, что это явный пример отсутствия решения OSFA. –

0

В определении класса я использую только идентификаторы классов, если у меня есть параметры, которые называются одинаково (или одинаковыми) для частных членов класса. Это позволяет избежать двусмысленности, а также упрощает чтение кода одновременно. Я не могу придумать другого случая, в котором вам нужно будет его использовать.