没有构造函数的实例?

时间:2011-05-21 19:33:38

标签: c++ visual-c++

我正在尝试创建自己的类似于XNA的Vector2D类来存储坐标。按照构造函数的示例here,我创建了下面的代码。但是,我得到一个错误,说没有与参数列表匹配的构造函数“Vector2D :: Vector2D”的实例。我不明白那是怎么回事......似乎是我的问题?

struct Vector2D {
    Vector2D(int *varX, int *varY);
    ~Vector2D();
    private: int *X, *Y;
};

Vector2D::Vector2D(int *varX, int *varY) {
    X = varX;
    Y = varY;
}

Vector2D::~Vector2D() {
    free(X);
    free(Y);

}

4 个答案:

答案 0 :(得分:5)

您最有可能尝试创建这样的Vector2D类:

Vector2D vector(1, 2);

使用指向int的指针不能像你在Vector2D构造函数定义中那样做,因为这些值不是指针,它们是整数常量。更改为简单的int对象,如下所示:

struct Vector2D 
{
    Vector2D(int varX, int varY): X(varX), Y(varY) {}  //initialization list
    //~Vector2D();  delete the destructor since it's not needed anymore

    int X, Y;
};

也不需要析构函数,因为您的数据对象不是指针,因此在对象的销毁时不需要额外清理堆上分配的内存。我刚刚评论过它,所以你可以看到它不再需要了。

最后,你可能希望你的数据成员为private如果你正在使用结构...你可以做到,但你必须添加一些函数来访问这些数据成员(即,如果你声明它们private那么你就不能做vector.x = 5;之类的事情。通常,如果您希望默认为class访问权限,则使用private,因为struct默认为public访问权限。

答案 1 :(得分:2)

我认为你选择了一个不好的例子。这个例子是一个字符串类,所以它需要指针,分配和释放存储等。字符串是可变长度的,所以他们需要做那样的事情。

我猜这个错误来自

Vector2D v(3, 5);

问题是你的构造函数需要int*个参数,而你用int个参数调用它。你不应该在这里使用指针。

答案 2 :(得分:0)

问题不在于定义,而在于您如何使用该类。 例如,代码如下:

int main(){
    Vector2D v2D_none;
}

会产生你正在谈论的错误,因为没有默认(无参数)构造函数。由于类型不匹配,调用Vector2D v2D(1,2)也会失败。

此外,在析构函数中使用free是一个糟糕的选择,正如评论中指出的那样。为什么你还要使用指针?

答案 3 :(得分:0)

似乎问题是你传递int而不是指向int。

如果要将参数保持为整数的指针,则必须将参数作为指针传递,或者以这种方式传递参数时创建新的int:

Vector2D v(new int(4), new int(8));

如您所见,我将整数4和8作为参数传递。

请注意使用delete代替free销毁变量。或者您也可以使用malloc/free来调整问题。

在这里你需要一个析构函数,因为你在传递参数的同时按需分配空间。