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

时间:2013-02-09 13:19:21

标签: c++ class reference struct parameter-passing

我是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;
}

所以问题的核心是,如何进入巴兹?

3 个答案:

答案 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是什么?你写的是吗getsingetcos?最好只称它为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标准。