C++通过引用修改函数中的结构值(可能存在编译顺序问题)
C++ modifying struct values from function by reference (potentially compile order issue)
我已经做了大量关于将结构成员传递给函数的阅读。然而,如果有人能澄清我哪里出了问题,我将不胜感激。我预测这更像是一个编译顺序/定义错误,尽管也可能存在语法错误。
据我所知,我可以修改结构成员的数据,并通过作为引用(在本例中不是指针)传递来避免任何复制。此方法还允许我保留用于访问函数内部各个成员的点符号。
Main.cpp:
// include headers
struct foo{
int a;
int b;
}foo_data;
int main(){
foo_data.a = 1; // assign some values to the member in standard format.
foo_data.b = 2;
function(foo_data);
// should this be &foo_data, am I passing by value here as it is
// or is the declaration taking care of that?
}
函数.h:
void function(foo &) // function declaration reference of type foo
functions.cp:
void function(foo &foo_data) // function definition reference of type foo
{
foo_data.a; // should == 1
foo_data.b; // should == 2
}
错误通常与未声明的标识符有关,即foo_data。我需要告诉函数中的tell声明吗?h我正在向它传递一个结构,或者实际上是一个int(引用?)
谢谢!
根本原因:
您会得到错误,因为编译器不知道/理解您在cpp文件中使用的类型foo
。只有当看到的定义时,它才能知道类型。
解决方案:
您需要将结构的声明放在头文件中,并将该头文件包含在声明函数的头文件和定义函数的cpp文件中。
函数.h
struct foo{
int a;
int b;
};
extern foo foo_data;
void function(foo &);
函数.cpp
#include "functions.h"
foo foo_data;
void function(foo &foo_data) function definition reference of type foo
{
//access local foo_data
foo_data.a // should = 1
foo_data.b // should = 2
//access global foo_data
::foo_data.a = 1;
::foo_data.b = 1;
}
Main.cpp
#include "functions.h"
int main()
{
//Global foo_data is accessible here now
foo_data.a =
foo_data.a =
....
}
编辑:
你的评论建议你想在多个源文件中共享一个foo_data
实例,在这种情况下,你应该使用extern
,我修改了上面的代码示例,注意在function()
中,本地foo_data
实例将隐藏全局实例,如果你想使用全局对象,那么你必须将其用作::foo_data
。
foo
的类定义必须对main
和function
都可见。这样做:
// File foo.hpp
struct foo { int a; int b; };
void function(foo &);
// File main.cpp
#include "foo.hpp"
int main()
{
foo foo_data;
foo_data.a = 1;
function(foo_data);
}
// File foo.cpp
#include "foo.hpp"
void function(foo & x)
{
// use x.a, x.b etc.
}
如果function
只需要读取值,则可以使用foo const &
参数声明它。
相关文章:
- 检查编译时是否存在静态函数
- 我正在尝试制作一个自平衡机器人,但编译时存在错误。我不知道如何解决它
- Microsoft Visual Studio 2019交叉编译CMake库 - 有效,但存在SEG错误
- 使用c++的gSOAP中的stdsoap2.cpp中存在编译错误
- 为什么 GCC 和 clang 之间编译的 c++17 lambda 存在差异?
- 为什么以下代码片段存在编译错误
- 如何在C++编译时检查运算符的特定重载是否存在
- 编译时日志/ilogb 是否存在
- 编译示例 Cinder 项目时存在大量未解决的外部问题
- C 编译时间检查模板类型中是否存在方法
- 使用SFINAE检测编译时间是否存在过载的独立式功能
- 使用clang编译时regex-segfault,可能存在编译器错误
- .so中存在的符号已编译.o引用了它,但链接失败
- 为什么Visual Studio 2015在Juce存在时无法编译带有"noexcept"的STL库?
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 为什么复制此类中的构造函数、运算符=和引用存在编译问题
- C++.继承和初始化成员变量存在编译错误
- C++通过引用修改函数中的结构值(可能存在编译顺序问题)
- 避免基于模板运算符的存在编译某些行
- Arduino库中存在编译错误