如何在c++中将结构传递给类

How to pass a struct to a class in c++?

本文关键字:结构 c++      更新时间:2023-10-16

我是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标准。