C ++, как передавать значения из одной структуры в другую? - PullRequest
1 голос
/ 23 июня 2011

У меня есть две разные структуры. Первый, astm, который считывает данные из файла .txt, а второй, rebar, использует значения из структуры один для чтения пользовательского ввода и выполнения вычислений. Sturct astm будет действовать как меню. Мой вопрос: как передать значения из struct astm в struct rebar?

вот две структуры:

typedef struct
{
    int size; 
    double weight;
    double diameter;
 } astm;

 typedef struct
 {
    int size;// user input from astm.size
    double length; // user input
  } rebar;

вот файл .txt (в действительности файл не содержит «sz», «wt» или «диаметр»):

sz   wt    diameter
2   0.167  0.250
3   0.376  0.375
4   0.668  0.500
5   1.043  0.625
6   1.502  0.750
7   2.044  0.875
8   2.670  1.000
9   3.400  1.128
10  4.303  1.27
11  5.313  1.41
14  7.65   1.693
18  13.6   2.257

Пример: Выберите размер: 4 Длина входа: 500

Размер: 4 диаметр: 0.500 Общий вес = длина * вес = 3340,0

Ответы [ 6 ]

1 голос
/ 23 июня 2011

Чтобы ответить на ваш вопрос:

astm myAstm;
myAstm.size = 5;
myAstm.weight = 30.0;
myAstm.diameter = 10;

rebar myRebar;
myRebar.size = myAstm.size;
myRebar.length = someCalculation(...)

Тем не менее, лучшим подходом было бы включение одного из них в другой:

typedef struct
{
    int size; 
    double weight;
    double diameter;
} astm;

typedef struct
{
    astm *myAstm;
    double length; // user input
} rebar;

Выполнение этого таким образом приведет кменее избыточные данные лежат вокруг, и это позволит вам обойти ровно одну структуру, которая представляет все.

astm myAstm;
myAstm.size = 5;
myAstm.weight = 30.0;
myAstm.diameter = 10;

rebar myRebar;
myRebar.myAstm = &myAstm;
myRebar.length = someCalculation(...)

// To get at the size attribute:
printf("size is %d\n", myRebar.myAstm->size);
0 голосов
/ 23 июня 2011

Если бы арматура использовала astm напрямую (а вы на самом деле используете C ++), вы бы получили что-то вроде этого:

struct astm
{
    astm( int size, float weight, float diameter )
    : size( size )
    , weight( weight )
    , diameter( diameter )
    {}

    int size;
    double weight;
    double diameter;
};

struct rebar
{
    rebar( int size, double length )
    : size( size )
    , length( length )
    {}

    rebar( const astm& astm ) //<<< Uses astm directly
    : size( astm.size )
    {
        // Do something with rest of astm
    }
};

Однако, похоже, это не так. Похоже, вы хотите что-то вроде:

    std::vector<rebar> rebarVec;
    for ( int i = 0; i < numThings; ++i )
    {
        // Compute stuff from astm[ i ]
        rebar rebarItem( size, length );
        rebarVec.push_back( rebarItem );
    }

Это то, что вы пытаетесь достичь?

0 голосов
/ 23 июня 2011

Я бы решил эту проблему, создав функцию:

void MoveInfo(const Astm &t, ReBar &bar);

Но для этого вам нужно правильно указать имена структур:

struct Astm { ... };
struct ReBar { ... };

Обратите внимание на положение имени структуры.

0 голосов
/ 23 июня 2011

В идеале, вы хотели бы иметь карту, которая ищет вес / диаметр в зависимости от размера.Так как вы используете C ++, взгляните на std::map (http://www.cplusplus.com/reference/stl/map/).

измените astm на только double weight, diameter; и при чтении текстового файла для каждого sz,сделать map.insert(pair<int,astm>(sz,astm_var));

При расчете просто найдите astm из map и оцените общий вес из него.

0 голосов
/ 23 июня 2011

Перегрузка оператором присваивания является одним из возможных маршрутов, но не многим это не нравится.Вы также можете передать их непосредственно в переменную-член.

objRebar.size = objastm.size;

Или вы можете превратить их в классы и добавить функцию-член, которая будет обрабатывать их для вас.Нужно ли использовать структуру?

0 голосов
/ 23 июня 2011

Вы можете перегрузить оператор присваивания.

Но будьте осторожны, перегрузка оператора - не всегда лучший способ.

Может быть, лучше использовать функцию преобразования или функцию-член.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...