Хотя void
может стоять на месте для типа, он фактически не может удерживать значение. Поэтому он не имеет размера в памяти. Получение размера void
не определено.
Указатель void
- это просто языковая конструкция, означающая указатель на память untyped .
Тестирование в классе - неправильный способ, предупреждение о том, что если ваш код правильно определен, то this
не должно быть нулевым, поэтому тест должен выполняться в тот момент, когда вы вызываете функцию-член: [ 117]
int main()
{
ExampleClass* myClass = nullptr; // always initialize a raw pointer to ensure
// that it does not point to a random address
// ....
if (myClass != nullptr) {
myClass->readSomeData(2.5);
}
return 0;
}
Если указатель не должен быть нулевым в определенной части вашего кода, вы должны сделать это в соответствии с CppCoreGuideline: I.12: Объявить указатель, который не должен быть нулевым, как not_null [115 ]
Micorosoft предоставляет библиотеку поддержки руководящих принципов , которая имеет реализацию для not_null
.
Или, если возможно, тогда вообще не используйте указатели, кроме std::optional
.
Таким образом, настройка кода может выглядеть следующим образом:
#include <gsl/gsl>
struct ExampleClass {
void readSomeData(double ){}
};
// now it is clear that myClass must not and can not be null within work_with_class
// it still could hold an invalid pointe, but thats another problem
void work_with_class(gsl::not_null<ExampleClass*> myClass) {
myClass->readSomeData(2.5);
}
int main()
{
ExampleClass* myClass = nullptr; // always initialize a raw pointer to ensure
// that it does not point to a random address
// ....
work_with_class(myClass);
return 0;
}
Лучший способ не использовать указатели на все:
int main()
{
ExampleClass myClass;
myClass.readSomeData(2.5);
}
Таким образом, нет необходимости в какой-либо проверки, а на самом деле, проверка this
внутри функции является спорным .
Если вам нужна обнуляемость, используйте вместо этого std::optional
.
Либо не используйте указатели, как указал Bartek Banachewicz, либо правильно инициализируйте и проверьте указатель:
int main()
{
ExampleClass* myClass= 0;
if (myClass)
myClass->readSomeData(2.5);
return 0;
}
Конечно, вы все еще должны добавить создание объект в какой-то момент, в противном случае код является бессмысленным.