在其他函数中设置结构成员的值

Setting values of struct members in other functions

本文关键字:成员 结构 设置 其他 函数      更新时间:2023-10-16

假设我有这样一个结构体:

    typedef struct Foo {
        int a;
        int b;
        int c;
    } Foo;

现在,我创建了这个初始化函数,它将为Foo分配内存,并将预设值放入我的对象,如下所示:

    void initializeFoo(Foo *foo) {
        foo = (Foo*)malloc(sizeof(Foo));
        foo->a=0;
        foo->b=15;
        foo->c=0;
    }

在Foo之上,假设我们创建了一个名为Display的c++类,这样我们就可以在屏幕上显示Foo。

     class Display {
          public:
              Display();
          private:
              Foo* foo;
     }

在Display构造函数中,我使用initializeFoo(foo)来初始化foo的值,但是我为foo设置的预设值不存在。

我认为这可能是内存分配问题。我确保Display被c++的"new"适当地分配。然而,我一整天都在为这件事挠头。

似乎它不工作的唯一原因是因为我在initializeFoo()中设置了这些值。但是,这对我来说没有意义。

还有谁有更好的意见,这里可能会发生什么?

你的意思可能是

void initializeFoo(Foo **foo) {
        *foo = (Foo*)malloc(sizeof(Foo));
        (*foo)->a=0;
        (*foo)->b=15;
        (*foo)->c=0;
    }

您正在将Foo指针按值传递给initializeFoo,因此无法修改调用者的指针。如果你想要这种类型的初始化式,你需要传递一个指针到另一个指针:

void initializeFoo(Foo **foo) {
    *foo = malloc(sizeof(Foo));
    (*foo)->a=0;
    (*foo)->b=15;
    (*foo)->c=0;
}

然而,在这种情况下,如果简单地返回Foo*会更容易:

Foo *initializeFoo() {
    Foo* foo = malloc(sizeof(Foo));
    foo->a=0;
    foo->b=15;
    foo->c=0;
    return foo;
}

甚至指针都是通过值传递的,就像所有的输出形参一样,它们必须通过地址传递(&var),或者在c++中,形参可以是引用类型(在本例中是引用到指针类型)。后者可能更好,更不用说最小的更改了:

改变:

void initializeFoo(Foo *foo) 

:

void initializeFoo(Foo*& foo) // <== note reference-to-pointer

话虽这么说,但在一个好的c++程序中,没有必要使用定义良好的RAII方法。阅读这篇简短的文档,了解如何从一开始就不应该使用指针来拥有资源。最终你的foo成员应该是一个智能指针,如果不是一个直接的对象实例。