-3

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

所以问题的关键是,我如何让 bar 进入 baz?

4

3 回答 3

3

已解决,将结构定义放入单独的标题中,并将其包含在需要的地方。然后只需对类头中的声明进行简单的更改,一切就完美了。我已经包含了新代码(为了 Abyx 的利益而减去 VS 代码,因为 Abyx 似乎觉得它很冒犯)以防其他人有同样的问题。

主要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;
}

富.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;
}
于 2013-02-09T21:29:06.363 回答
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;
    }
于 2013-02-09T13:23:59.007 回答
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的末尾不需要 . ,因为这是 . 的默认返回值。还有,那是什么?你写例如或?最好叫它。然后, mainmaingetSumgetsingetcossum

#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类头文件,永远不要在头文件中拥有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 标准。

于 2013-02-09T13:30:00.727 回答