Указатель передачи C++ ссылкой и присваивает значение по умолчанию

Как насчет этого:

if (object.Equals(myArgument, default(T)))
{
    //...
}

Используя static object.Equals() метод избегает потребности в Вас сделать эти null проверка самих. Явно квалификация вызова с object., вероятно, не необходима в зависимости от Вашего контекста, но меня обычно префикс static вызовы с именем типа только для создания кода более разрешимым.

6
задан quark 2 December 2009 в 01:23
поделиться

4 ответа

В сообщении об ошибке сказано все: вы передаете целое число вместо ссылки на указатель на SomeType. Чтобы делать то, что вы хотите, вы можете использовать указатель на указатель на SomeType:

void myFunc(SomeType** var=NULL);

void MyClass::myFunc(SomeType** var){
    if(var!=NULL && *var!=NULL)
        (**var)=(*someOtherPointer);

    if(var!=NULL && someCondition)
        *var=NULL;
}
7
ответ дан 8 December 2019 в 03:53
поделиться

NULL не является l-значением - его нельзя передать по ссылке. Это было бы похоже на передачу 4 функции, которая ожидает int & .

Часть 'int' обусловлена ​​тем, что NULL определен макросом ] 0 .

Лучше всего использовать указатель для передачи указателя по ссылке, то есть двойной указатель. Затем, если параметр равен NULL , ничего не было передано. В противном случае следует изменить адрес указателя [чтобы он указывал на NULL, если выполняется какое-то условие].

14
ответ дан 8 December 2019 в 03:53
поделиться

Вы также можете рассмотреть возможность использования boost :: optional (не самый простой код, который вы можете использовать, но вариант есть):

void f( boost::optional<int&> r = boost::optional<int&>() )
{
   if ( r ) *r = 5;
}
int main()
{
   int x = 0;
   f( x ); std::cout << x << std::endl; // 5, it did change the value
   f(); // compiler will default to an empty optional<int&> object
}
2
ответ дан 8 December 2019 в 03:53
поделиться

Хорошо, я понимаю, почему вы сделали это с точки зрения тренировки мозга C ++, но действительно ли вы делаете это в производственном коде? Это выглядит как невероятно туманная техника с побочными эффектами, если посмотреть на код как коллега год спустя. Думали ли вы об использовании двух отдельных функций с понятными именами, одна из которых возвращает указатель, а другая выполняет любую другую необходимую работу?

2
ответ дан 8 December 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: