C ++ изменение значений структуры из функции по ссылке (возможно, проблема порядка компиляции) - PullRequest
1 голос
/ 31 марта 2012

Я много читал о передаче члена структуры в функцию. Однако, если кто-то может уточнить, где я иду не так, я был бы признателен. Я предсказываю, что это скорее ошибка порядка / определения компиляции, чем любая другая, хотя могут быть и синтаксические ошибки.

Насколько я понимаю, я могу изменять данные членов структуры и избегать любого копирования, передавая в качестве ссылки (в данном случае НЕ указатель). Этот метод также позволит мне сохранить пунктирную запись для доступа к отдельным элементам внутри функции.

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? 
}

functions.h:

void function(foo &) // function declaration reference of type foo

functions.cpp:

void function(foo &foo_data) // function definition reference of type foo
{
  foo_data.a; // should == 1
  foo_data.b; // should == 2
}

Ошибки обычно связаны с необъявленными идентификаторами, являющимися foo_data. Должен ли я сказать сказать объявлению в функциях. Я передаю ему структуру или фактически int (ссылка?)

Спасибо!

Ответы [ 2 ]

1 голос
/ 31 марта 2012

Определение класса для 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 &.

1 голос
/ 31 марта 2012

Основная причина:
Вы получаете ошибку, потому что компилятор не знает / не понимает тип foo, который вы используете в вашем файле cpp. Он может знать тип, только если он видит его определение.

Решение:
Вам нужно поместить объявление структуры в файл заголовка и включить этот файл заголовка как в заголовок, где вы объявляете функцию, так и в файл cpp, где вы ее определяете.

functions.h

struct foo{
int a;
int b;
};
extern foo foo_data;
void function(foo &);

functions.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 =
    ....
}

EDIT:
Ваши комментарии предполагают, что вы хотите поделиться экземпляром foo_data между несколькими исходными файлами, в этом случае вы должны использовать extern, для этого я модифицировал приведенный выше пример кода, обратите внимание, что внутри function() локальный экземпляр foo_data будет скрыть глобальный экземпляр и, если вы хотите использовать глобальный объект, вы должны использовать его как ::foo_data.

...