Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在c++;?_C++_Oop_Object_Pass By Reference - Fatal编程技术网

C++ 如何在c++;?

C++ 如何在c++;?,c++,oop,object,pass-by-reference,C++,Oop,Object,Pass By Reference,我有两个类,在示例中添加了矩形和矩形。目标是创建一个矩形对象,其中包含对多个矩形对象的引用 如果我通过r.set_值(4,4)更改r,则关闭粗略r.area()。但是,如果我调用rectanges.rects[0].area()它仍然是12,因此不会更改 据我所知,我在矩形中引用了r,但这似乎是错误的 如何做到这一点 代码是可用的 您的代码的错误在于您对矩形的定义。它存储指向矩形的指针(或数组)。这里需要的不是矩形的数组,而是对矩形的引用数组。此处,引用应为指针,因此您需要相应地更改: clas

我有两个类,在示例中添加了矩形和矩形。目标是创建一个矩形对象,其中包含对多个矩形对象的引用

如果我通过
r.set_值(4,4)
更改
r
,则关闭粗略
r.area()。但是,如果我调用
rectanges.rects[0].area()
它仍然是12,因此不会更改

据我所知,我在
矩形中引用了
r
,但这似乎是错误的

如何做到这一点

代码是可用的


您的代码的错误在于您对
矩形的定义。它存储指向
矩形的指针(或数组)。这里需要的不是
矩形
的数组,而是对
矩形
的引用数组。此处,引用应为指针,因此您需要相应地更改:

class Rectangles {
    public:
    Rectangles(int n);
    void addRectangle(Rectangle* r);

    // Rectangle* rects;
    // What you really want :
    Rectangle** rects;

    int nRects;
};
但是,您还需要更改实现:

Rectangles::Rectangles(int n) {
    rects = new Rectangle*[n]; // Array of pointers
    nRects = 0;
}

void Rectangles::addRectangle(Rectangle* r) {
    rects[nRects] = r; // r is a pointer : just store it, no dereferencing
    nRects++;
}
然而,这是一个糟糕的设计:您不应该使用以下任何一种:指向指针的指针(或指针的“原始数组”)、
new
,以及一个仅用于存储事物数组的类。这是因为您已经有了更好的工具:智能指针(尽管这里也不需要它们)、数组和动态数组(或向量)

如果我是你,我会这样重写你的代码:

#include <iostream>
#include <vector>

class Rectangle {
public:
    void setSize(int w, int h);
    int area();

private:
    int width, height;
};

void Rectangle::setSize(int w, int h) {
    width = w;
    height = h;
}

int Rectangle::area() {
    return width * height;
}

int main() {
    Rectangle r;
    std::vector<Rectangle*> rectangles;
    r.setSize(4, 3);

    rectangles.push_back(&r);

    std::cout << "r.area() before change : " << r.area() << std::endl
              << "rectangles[0]->area() before change : "
              << rectangles[0]->area() << std::endl;

    r.setSize(4, 4);

    std::cout << "r.area() after change : " << r.area() << std::endl
              << "rectangles.rects[0]->area() after change : "
              << rectangles[0]->area() << std::endl;

    return 0;
}
#包括
#包括
类矩形{
公众:
无效设置大小(整数w,整数h);
int区域();
私人:
int宽度、高度;
};
空矩形::设置大小(整数w,整数h){
宽度=w;
高度=h;
}
int矩形::区域(){
返回宽度*高度;
}
int main(){
矩形r;
向量矩形;
r、 设置大小(4,3);
矩形。向后推(&r);

std::cout No,您没有在
矩形中保留引用,您正在复制
矩形
对象。如果您想要一组引用,我建议您阅读和。@JoachimPileborg好的,我应该如何更改此代码,以便保留引用?看起来不错,我想知道是否可以在arduino程序中使用它。W帽子是一个ARDUIO程序吗?只要支持C++,就可以了。我刚刚发现,有ARDUNO的特定库和向量的使用。所以我可以解决这个问题。
r.area() before change:12
rectangles.rects[0]->area() before change:12
r.area() after change:16
rectangles.rects[0]->area() after change:16
class Rectangles {
    public:
    Rectangles(int n);
    void addRectangle(Rectangle* r);

    // Rectangle* rects;
    // What you really want :
    Rectangle** rects;

    int nRects;
};
Rectangles::Rectangles(int n) {
    rects = new Rectangle*[n]; // Array of pointers
    nRects = 0;
}

void Rectangles::addRectangle(Rectangle* r) {
    rects[nRects] = r; // r is a pointer : just store it, no dereferencing
    nRects++;
}
#include <iostream>
#include <vector>

class Rectangle {
public:
    void setSize(int w, int h);
    int area();

private:
    int width, height;
};

void Rectangle::setSize(int w, int h) {
    width = w;
    height = h;
}

int Rectangle::area() {
    return width * height;
}

int main() {
    Rectangle r;
    std::vector<Rectangle*> rectangles;
    r.setSize(4, 3);

    rectangles.push_back(&r);

    std::cout << "r.area() before change : " << r.area() << std::endl
              << "rectangles[0]->area() before change : "
              << rectangles[0]->area() << std::endl;

    r.setSize(4, 4);

    std::cout << "r.area() after change : " << r.area() << std::endl
              << "rectangles.rects[0]->area() after change : "
              << rectangles[0]->area() << std::endl;

    return 0;
}