尝试初始化“rect”时无效使用类“rect”(c ++)

时间:2016-06-24 18:05:58

标签: c++ class initialization this

解决:

我的错误是使用dot而不是= 如此改变:

myRect.Rect(pt1,pt2,pt3,pt4); <-- didn't work
myRect = Rect(pt1,pt2,pt3,pt4); <-- worked

(感谢您的快速帮助!即使是为这个问题获得-1)

初始问题:

我尽量让问题变得简单。我不知道为什么这不起作用。如何更改已创建rect的点数?我的猜测是我使用'this ->运算符'无法正常工作。

我甚至不知道如何正确地标题我的问题,任何提示更好的标签?

point.h

class Point
{
private:
public:
    int X;
    int Y;
};

point.cpp

Point::Point() {
    X = 0;
    Y = 0;
}

rect.h

class Rect
{
private:
    Point P1, P2, P3, P4;
public:
    Rect();
    Rect(Point p1, Point p2, Point p3, Point p4);
};

rect.cpp

Rect::Rect(Point p1, Point p2, Point p3, Point p4) {
    this -> P1 = p1;
    this -> P2 = p2;
    this -> P3 = p3;
    this -> P4 = p4;
}

的main.cpp

int main(){

    Rect myRect;

    Point pt1;
    Point pt2;
    Point pt3;
    Point pt4;

    myRect.Rect(pt1,pt2,pt3,pt4);
}

的ErrorMessage:

  

无效使用'Rect::Rect'

3 个答案:

答案 0 :(得分:2)

您误解了方法的构造函数。看看这个问题的答案(关于Java,但类似的想法适用):https://stackoverflow.com/a/25803084/4816518

总而言之,构造函数(包括默认构造函数)用于初始化对象,不返回任何内容(如果您不包含正在创建的对象),则命名与对象相同(例如(?:^|[^a-zA-Z])InitializationEvent(?:[^a-zA-Z]|$) Rect::Rect类的构造函数 另一方面,方法用于在已创建的对象上调用某些行为。此外,与构造函数不同,它们可以具有返回类型。

所以,而不是这个

Rect

您可能想要更多内容:

Rect myRect;

Point pt1;
Point pt2;
Point pt3;
Point pt4;

myRect.Rect(pt1,pt2,pt3,pt4);

或者这个:

Point pt1 = Point(0,0); //Didn't see this constructor, but you probably need it.
Point pt2 = Point(1,1); //I'm choosing random values.
Point pt3 = Point(0,1);
Point pt4 = Point(1,0);

myRect = Rect(pt1,pt2,pt3,pt4); //this creates the Rect with the given points.

甚至这个更简化的版本(但是,你需要声明一个Point pt1(0,0); Point pt2(1,1); Point pt3(0,1); Point pt4(1,0); Rect myRect(pt1,pt2,pt3,pt4); 构造函数,而Point::Point(int x, iny y)的构造函数需要获取Rect个参数)。

const Point&

构造函数(在您的情况下为Rect myRect(Point(0,0),Point(1,1),Point(0,1),Point(1,0)); Point::Point())创建对象,然后可以在其上执行方法。

Rect::Rect(Point p1, Point p2, Point p3, Point p4)声明一个变量并使用默认构造函数实例化它。如果要将参数传递给对象,则需要使用Rect myRect之类的参数调用构造函数。

答案 1 :(得分:1)

有两个错误。

1。 你需要为Point声明一个默认构造函数,以便创建你在类之外定义的构造函数。

class Point
{
private:
public:
    Point(); // <-- add this
    int X;
    int Y;
};

2。 您不需要使用类访问点运算符来使用Rect()。这是因为Rect()是构造函数,并且不需要像对函数那样在对象上调用构造函数。

Rect myRect;
myRect = Rect(pt1,pt2,pt3,pt4);

或者

Rect myRect = Rect(pt1,pt2,pt3,pt4);

Rect myRect(pt1,pt2,pt3,pt4);

答案 2 :(得分:1)

您首先使用默认构造函数(myRect)构造Rect::Rect(),然后尝试将其他构造函数作为成员函数调用。 (这是无效使用)

相反,请直接使用其他构造函数:Rect myRect(p1, p2, p3, p4)

关于this->P1,您不需要使用this来访问成员变量。 对于构造函数,使用初始化列表作为 Rect(Point p1, Point p2, Point p3, Point p4) :P1{p1},P2{p2},P3{p3},P4{p4} {}优先在构造函数体中进行赋值,原因相同:如果不初始化成员,则在进入构造函数体之前将默认构造它们。