Другим сценарием является то, что вы нанесли нулевой объект в тип значения . Например, код ниже:
object o = null;
DateTime d = (DateTime)o;
Он выкинет NullReferenceException
в роли. В приведенном выше примере это кажется совершенно очевидным, но это может произойти в более «поздних связующих» сложных сценариях, где нулевой объект был возвращен из некоторого кода, которого вы не являетесь, и приведение, например, генерируется некоторой автоматической системой.
Одним из примеров этого является этот простой фрагмент привязки ASP.NET с элементом управления календарем:
" />
Здесь SelectedDate
на самом деле является свойством - типа DateTime
- типа Calendar
Web Control, и привязка может отлично вернуть что-то null. Неявный генератор ASP.NET создаст кусок кода, который будет эквивалентен приведенному выше методу. И это поднимет NullReferenceException
, что довольно сложно определить, потому что он лежит в сгенерированном ASP.NET коде, который компилирует отлично ...
Поскольку вы используете C ++, если вы хотите изменить xc
и yc
, вы можете использовать ссылки:
void trans(double x, double y, double theta, double& m, double& n)
{
m=cos(theta)*x+sin(theta)*y;
n=-sin(theta)*x+cos(theta)*y;
}
int main()
{
// ...
// no special decoration required for xc and yc when using references
trans(center_x, center_y, angle, xc, yc);
// ...
}
Если вы используете C, вам нужно будет пройти явные указатели или адреса, такие как:
void trans(double x, double y, double theta, double* m, double* n)
{
*m=cos(theta)*x+sin(theta)*y;
*n=-sin(theta)*x+cos(theta)*y;
}
int main()
{
/* ... */
/* have to use an ampersand to explicitly pass address */
trans(center_x, center_y, angle, &xc, &yc);
/* ... */
}
Я бы рекомендовал проверить запись C ++ FAQ Lite в ссылках для получения дополнительной информации о том, как правильно использовать ссылки.
Передача по ссылке действительно является правильным ответом, однако C ++ sort-to позволяет возвращать многозначные значения с использованием std::tuple
и (для двух значений) std::pair
:
#include <cmath>
#include <tuple>
using std::cos; using std::sin;
using std::make_tuple; using std::tuple;
tuple<double, double> trans(double x, double y, double theta)
{
double m = cos(theta)*x + sin(theta)*y;
double n = -sin(theta)*x + cos(theta)*y;
return make_tuple(m, n);
}
Таким образом, вам вообще не нужно использовать out-parameters.
На стороне вызывающего абонента вы можете использовать std::tie
для распаковки кортежа в другие переменные:
using std::tie;
double xc, yc;
tie(xc, yc) = trans(1, 1, M_PI);
// Use xc and yc from here on
Hope это помогает!
Вам нужно передать свои переменные по ссылке, что означает
void trans(double x,double y,double theta,double &m,double &n) { ... }
, как сказано выше, вам нужно передать по ссылке, чтобы вернуть измененные значения «m» и «n», но ... рассмотреть возможность передачи всего по ссылке и использовать const для параметров, которые вы не хотите изменять внутри ваша функция, т.е.
void trans(const double& x, const double& y,const double& theta, double& m,double& n)