-3

找不到此问题的明确解决方案。

我有两个班级PointVector. Vector是我想使用类的对象的类Point方法之一的子级。我这样做:PointVector

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

4 回答 4

1

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

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

因此,您需要重组为:

点.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

点.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));
}

矢量.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

向量.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);
}

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

于 2013-11-04T13:45:54.903 回答
1

提前声明:

class Vector;

在文件的开头。

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

于 2013-11-04T13:38:07.793 回答
0

虚函数可能会为您解决问题。即在派生的基本move() 声明中的move() Stub。使用指针进行动态绑定。

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

等等等等

于 2013-11-04T14:57:04.843 回答
0

如果你的班级Vector

class Vector: public Point

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

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

于 2013-11-04T13:40:29.660 回答