我有两种不同的结构。第一个是astm,它从.txt文件读取数据,第二个是rebar,它使用结构1中的值来读取用户输入,然后进行计算。 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”或“diameter”):
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
答案 0 :(得分:1)
回答你的问题:
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);
答案 1 :(得分:0)
您可以重载赋值运算符。
但是要小心,运算符重载并不总是最好的方法。
也许,转换函数或成员函数是更好的选择。
答案 2 :(得分:0)
重载赋值运算符是一种可能的路径,但并不是很多人不喜欢这样。您也可以将它们直接传递给成员变量。
objRebar.size = objastm.size;
或者你可以将它们变成类并添加一个成员函数来为你处理它。你是否有必要使用结构?
答案 3 :(得分:0)
理想情况下,您希望有一张根据尺寸查看重量/直径的地图。
由于您使用的是C ++,请查看std::map
(http://www.cplusplus.com/reference/stl/map/)。
将astm
更改为仅保留double weight, diameter;
,并在阅读每个sz
的txt文件时,执行map.insert(pair<int,astm>(sz,astm_var));
计算时,只需从astm
中查找map
,然后从中评估总重量。
答案 4 :(得分:0)
我会通过创建一个函数来解决这个问题:
void MoveInfo(const Astm &t, ReBar &bar);
但要做到这一点,你需要正确提供结构名称:
struct Astm { ... };
struct ReBar { ... };
注意结构名称的位置。
答案 5 :(得分:0)
如果rebar直接使用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 );
}
这是你想要完成的吗?