如何创建将坐标初始化为随机值的构造函数?

时间:2013-04-24 13:53:07

标签: c++ constructor

我有这个类“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");
    }

6 个答案:

答案 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; }