如何在c++中将结构传递给类
How to pass a struct to a class in c++?
我是c++的新手,这一次让我很困惑。我想把一个结构传递给一个类(我知道它们在技术上是一样的),这样该类就可以访问结构中的数据。我不介意它是作为引用还是副本传递,因为类中的结构不会发生任何更改。话虽如此,引用可能对性能更好。如果我单独传递结构的成员,我可以让它正常工作,但实际版本大约有30个成员,所以单独传递不是最好的选择。
我的主cpp:
#include "stdafx.h"
#include "myClass.h"
#include <iostream>
using namespace std;
struct foo
{
int num;
double dbl;
};
int _tmain(int argc, _TCHAR* argv[])
{
foo bar;
bar.dbl=3.14;
bar.num=42;
baz qux(); //bar needs to be passed here
cout<<qux.getSum()<<endl;
return 0;
}
类标题:
using namespace std;
class baz
{
public:
baz(); //This is where type of bar (foo) is declared
void setSum(int, double);
double getSum();
private:
double sum;
};
类cpp:
#include "stdafx.h"
#include "myClass.h"
#include <iostream>
using namespace std;
baz::baz() //this is where bar is called
{
setSum(bar.num, bar.dbl);
}
void baz::setSum(int num, double dbl)
{
sum=num*dbl;
}
double baz::getSum()
{
return sum;
}
所以问题的关键是,我该如何把酒吧变成集市?
解决后,将结构定义放入一个单独的头中,并将其包含在需要的地方。然后,只需对类头中的声明进行简单的更改,一切都会完美运行。我已经包含了新代码(为了Abyx的利益,减去VS代码,他似乎觉得它很冒犯),以防其他人有同样的问题。
主cpp:
#include "myClass.h"
#include "foo.h"
#include <iostream>
using namespace std;
int main(int argc, _TCHAR* argv[])
{
foo bar;
bar.dbl=3.14;
bar.num=42;
baz qux(bar);
cout<<qux.getSum()<<endl;
return 0;
}
foo.h:
struct foo
{
int num;
double dbl;
};
myClass.h:
class baz
{
public:
baz(const struct foo&);
void setSum(int, double);
double getSum();
private:
double sum;
};
myClass.cpp:
#include "myClass.h"
#include "foo.h"
#include <iostream>
using namespace std;
baz::baz(const foo& blah)
{
setSum(blah.num, blah.dbl);
}
void baz::setSum(int num, double dbl)
{
sum=num*dbl;
}
double baz::getSum()
{
return sum;
}
制作额外的构造函数。类似的东西:
baz::baz(const foo& st){
setSum(st);
}
void baz::setSum(const foo& st)
{
setSum(st.num, st.dbl);
}
那么你可以:
int _tmain(int argc, _TCHAR* argv[])
{
foo bar;
bar.dbl=3.14;
bar.num=42;
baz qux(bar); //bar needs to be passed here
cout<<qux.getSum()<<endl;
return 0;
}
您的主程序:
#include "stdafx.h"
#include "myClass.h"
#include <iostream>
using namespace std;
struct foo
{
int num;
double dbl;
};
int _tmain(int argc, _TCHAR* argv[])
{
foo bar;
bar.dbl=3.14;
bar.num=42;
baz qux(); //bar needs to be passed here
cout<<qux.getSum()<<endl;
return 0;
}
好吧,stdafx.h
是一个只有当您打开(或忽略关闭)使用Microsoft预编译头时才有意义的头,这使得Visual C++预处理器的行为明显不标准。所以最好把它去掉。此外,_tmain
是一个Windows 9x支持宏,可扩展为标准main
或Microsoft特定的wmain
。所以也抛弃它。最后,在标准main
的末尾不需要return 0
,因为这是main
的默认返回值。还有,getSum
是什么?你写的是getsin
还是getcos
?最好叫它sum
。然后,
#include "myClass.h"
#include <iostream>
using namespace std;
struct foo
{
int num;
double dbl;
};
int main()
{
foo bar;
bar.dbl=3.14;
bar.num=42;
baz qux( bar ); // See how easy it is to pass `bar`
cout<<qux.sum()<<endl;
}
对于baz
类头文件,DONOT EVER在头文件的全局命名空间中具有using namespace std
。也就是说,把它也去掉。然后,
#pragma once
#include -- relevant header --
class baz
{
private:
double sum_;
public:
baz( foo const& blah ): sum_( blah.whatever + something ) {}
void setSum( int const n, double const v ) { sum_ = n*v; }
double sum() const { return sum_; }
};
注意:#pragma once
是事实上的标准,但不是ISO标准。
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- vscode g++链路故障:体系结构x86_64的未定义符号
- C++概念:如何使用'concept'检查模板化结构的属性?