c ++:在另一个类中初始化一个类的对象

时间:2013-11-04 13:36:25

标签: c++ initialization

无法为此问题找到明确的解决方案。

我有两个班级PointVectorVectorPoint的孩子。在Point类的一种方法中,我想使用类Vector的对象。我是这样做的:

class Point
{
    double x, y, z;

    public:
    // constructor from 3 values
    Point(double x, double y, double z)
    : x(x), y(y), z(z)
    {}

    // method move point
    Point move(Vector vect, double dist)
    {
        Vector vectU = vect.unit();
        return sum(vectU.multiplyScalar(dist));
    }
};

class Vector: public Point
{
    double x, y, z;

    public:
    // constructor from 3 values
    Vector(double x, double y, double z)
    : Point(x, y, z), x(x), y(y), z(z)
    {}

    // create unit vector
    Vector unit()
    {
        double len = length();
        return Vector(x / len, y / len, z / len);
    }
};

当我编译它时,它在行Point move(Vector vect, double dist) "Vector" has not been declared中给出了一个错误。我找不到任何有用的答案来解决这个错误。我该如何进行初始化?

4 个答案:

答案 0 :(得分:1)

提出前瞻性声明:

class Vector;

在文件的开头。

另外,放一个;在每个班级的定义之后。

答案 1 :(得分:1)

在C ++中,需要在定义类之前声明它。在一个文件中包含所有内容的示例中,当您定义Vector函数时,它不知道Point::move是什么。

通常,我们每个类(MyClass.h等)都有一个头文件,并将函数定义放在每个类的cpp文件中(MyClass.cpp

所以你需要重组为:

<强> Point.h:

#ifndef _POINT_H
#define _POINT_H

class Vector;  // Forward declaration so you don't need to include Vector.h here

class Point
{
    double x, y, z;

    public:
    // constructor from 3 values
    Point(double x, double y, double z);

    // method move point
    Point move(Vector vect, double dist);
}

#endif // _POINT_H

<强> Point.cpp

#include "Point.h"
#include "Vector.h"

// constructor from 3 values
Point::Point(double x, double y, double z)
: x(x), y(y), z(z)
{}

// method move point
Point Point::move(Vector vect, double dist)
{
    Vector vectU = vect.unit();
    return sum(vectU.multiplyScalar(dist));
}

<强> Vector.h

#ifndef _VECTOR_H
#define _VECTOR_H

#include "Point.h"

class Vector: public Point
{
    double x, y, z;

    public:
    // constructor from 3 values
    Vector(double x, double y, double z)
    : Point(x, y, z), x(x), y(y), z(z);

    // create unit vector
    Vector unit();
}

#endif // _VECTOR_H

<强> Vector.cpp

#include "Vector.h"

// constructor from 3 values
Vector::Vector(double x, double y, double z)
: Point(x, y, z), x(x), y(y), z(z)
{}

// create unit vector
Vector Vector::unit()
{
    double len = length();
    return Vector(x / len, y / len, z / len);
}

(免责声明,不保证会立即编译和工作,这只是为了演示如何拆分代码!)

答案 2 :(得分:0)

如果您的班级Vector

class Vector: public Point

继承自Point,那么你不应该在基类Vector中使用Point(基类不应该知道派生类的任何内容)。

此外,您正在重新定义派生类x, y, z中的Vector,这会破坏继承点,并且在使用多态时可能会导致非常讨厌的行为。

答案 3 :(得分:0)

虚拟功能可以帮到你。 即 move()存根于基地 派生中的move()声明。 使用指针进行动态绑定。

例如point * x = new vector(...) x.move()

等等。