C++通过引用修改函数中的结构值(可能存在编译顺序问题)

C++ modifying struct values from function by reference (potentially compile order issue)

本文关键字:存在 编译 问题 顺序 结构 引用 修改 函数 C++      更新时间:2023-10-16

我已经做了大量关于将结构成员传递给函数的阅读。然而,如果有人能澄清我哪里出了问题,我将不胜感激。我预测这更像是一个编译顺序/定义错误,尽管也可能存在语法错误。

据我所知,我可以修改结构成员的数据,并通过作为引用(在本例中不是指针)传递来避免任何复制。此方法还允许我保留用于访问函数内部各个成员的点符号。

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的类定义必须对mainfunction都可见。这样做:

// 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 &参数声明它。