我是c ++的新手,这个让我很难过。我想将一个结构传递给一个类(我知道它们在技术上是相同的),因此该类可以访问结构中的数据。我不介意它是作为引用还是副本传递,因为类中的结构不会有任何更改。虽然说参考可能会更好地表现。如果我单独传递结构的成员但是真正的版本将有大约30个成员,那么我可以完全正常工作,因此单独传递它们不是最好的选择。
我的主要话题:
#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;
}
所以问题的核心是,如何进入巴兹?
答案 0 :(得分:2)
已解决,将结构定义放入单独的标题中,并包含在需要的地方。然后只需对类标题中的声明进行简单的更改,一切都很完美。我已经包含了新代码(减去VS代码以便Abyx的利益似乎发现它如此令人反感)以防其他人遇到同样的问题。
Main 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;
}
答案 1 :(得分:0)
制作额外的构造函数。这样的事情:
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;
}
答案 2 :(得分: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
。所以沟也说。最后,标准 return 0
末尾不需要main
,因为这是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
类头文件, DO NOT 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标准。