在其他函数中设置结构成员的值
Setting values of struct members in other functions
假设我有这样一个结构体:
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
成员应该是一个智能指针,如果不是一个直接的对象实例。
相关文章:
- 如何在C++中定义静态成员结构
- 使用模板化类的成员结构
- 初始化固定的 C 数组成员结构
- 指向成员结构的指针如何工作
- 如何将此“指针从外部类传递到成员结构
- 导致IAR ARM中出现错误的成员结构位字段元素的Initializer列表初始化
- 映射文件中成员结构的地址
- Visual C++ 模板类成员结构初始化语法糖
- C :初始化成员结构的静态字段的正确方法
- 如何在C 类的初始化器列表中使用未命名结构初始化成员结构
- 从成员结构的成员函数中访问类的成员?
- 模板化类的成员函数无法返回指向成员结构的指针?
- 重载非类型模板结构的成员结构的复制赋值运算符
- 灵气属性传播问题与单成员结构.
- 将具有 int* 成员C++结构编接到 C#
- 复杂的班级成员结构
- 将向量成员(结构)传递给函数
- 成员结构的前向声明
- 重载运算符<<用于模板结构中定义的成员结构
- 返回带有模板化类的类成员结构