我有这个类“Point”,它接受x和y作为参数。 但是我需要创建一个构造函数,将它们初始化为随机值。 我不确切知道它是如何完成的。这是我的代码: 我创建了构造函数,但即使设置了x和y,我也得到了荒谬的值。
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
class Point
{
private:
double x;
double y;
public:
double get_x()
{
return x;
}
void set_x (double x)
{
this->x = x;
}
double get_y()
{
return y;
}
void set_y(double y)
{
this->y = y;
}
double distanceTo(Point p)
{
double x2 = p.get_x();
double y2 = p.get_y();
return sqrt( pow(x-x2,2) + pow(y-y2,2) );
}
Point(double x, double y)
{
x = rand()*1.0 / RAND_MAX * 100;
y = rand()*1.0 / RAND_MAX * 100;
}
Point(){};
};
void main()
{
Point a(1.2,0.5);
Point b;
b.set_x(1);
b.set_y(1);
cout << a.distanceTo(b);
system ("Pause");
}
答案 0 :(得分:4)
这是因为您没有初始化成员变量,而是更改传递给构造函数的变量的副本。因此,您看到垃圾值为x
,而y
(类版本)从未初始化。您应该将其更改为:
Point()
{
x = rand()*1.0 / RAND_MAX * 100;
y = rand()*1.0 / RAND_MAX * 100;
}
此外,您永远不会在任何地方调用srand()
- 您需要在某些时候执行此操作以正确播种随机生成器。
答案 1 :(得分:0)
因为您正在改变构造函数中的临时变量(同一范围内的名称冲突)。尝试:
Point(double x, double y)
{
Point::x = rand()*1.0 / RAND_MAX * 100;
Point::y = rand()*1.0 / RAND_MAX * 100;
}
但这完全忽略了给构造函数的参数。但是现在你知道如何区分变量的不同范围,我相信你可以从这里开始。
答案 2 :(得分:0)
您的默认构造函数不执行任何操作。它甚至没有初始化值,这意味着它们将具有未指定的值。
你的构造函数只接受两个参数赋值给参数,因为它们的名字会影响成员的名字。
答案 3 :(得分:0)
更改
Point(){};
到
Point()
{
x = rand()*1.0 / RAND_MAX * 100;
y = rand()*1.0 / RAND_MAX * 100;
}
我也建议改变你的论点\成员名称以避免错误。我个人喜欢使用m_
成员:
private:
double m_x;
double m_y;
答案 4 :(得分:0)
你正在收到'名字冲突'。在这个功能
Point(double x, double y)
{
x = rand()*1.0 / RAND_MAX * 100;
y = rand()*1.0 / RAND_MAX * 100;
}
编译器在分配时不知道你指的是哪个x。语言规则会说应该分配输入参数 - 但你不应该依赖它 - 因为它不必要地混淆。
一个好的做法是采用成员变量的命名约定。两个常见的是用“m”或“_”作为成员的前缀。我个人喜欢“我”。
然后您的代码变为:
class Point
{
public:
double mX;
double mY;
Point(double x, double y)
{
mX = rand()*1.0 / RAND_MAX * 100;
mY = rand()*1.0 / RAND_MAX * 100;
}
}
此例中的构造函数参数也是多余的,可以删除。
上面的其他一些答案也是正确的 - 但如果您必须在简单函数中明确范围名称(例如Point ::),那么这是一个糟糕的类设计的标志。
答案 5 :(得分:0)
错误:您通过值更改传递给构造函数的变量的本地副本(它们与成员变量具有相同的名称),并且成员变量未初始化,因此您的程序具有未定义的行为。
如何修复:您必须明确指出要分配的变量。此外,重载您的构造函数,因此您将拥有一个(默认)随机值,一个用于用户预定义。
另外:
double
,而不是按值传递 代码:
class Point
{
public:
Point() :
x(rand()*1.0 / RAND_MAX * 100),
y(rand()*1.0 / RAND_MAX * 100)
{
}
Point(const double& x, const double& y) :
x(x),
y(x)
{
}
private:
double x, y;
};
int main()
{
Point pt(42, 3.14);
Point pt_random;
}
访问者功能相同:
double GetX() const { return x; }
void SetX(const double& x) { Point::x = x; }