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

質問の要点は、どうすればバーをバズに入れることができるかということです。

4

3 に答える 3

3

解決し、構造体定義を別のヘッダーに入れ、必要な場所に含めました。次に、クラス ヘッダーの宣言を変更するだけで、すべてが完全に機能します。他の誰かが同じ問題を抱えている場合に備えて、新しいコードを含めました(非常に攻撃的であると思われる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;
}
于 2013-02-09T21:29:06.363 に答える
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;
}

ええと、 Microsoftのプリコンパイル済みヘッダーstdafx.hの使用をオンにする(またはオフにするのを省略する)場合にのみ意味のあるヘッダーです。これにより、VisualC++プリプロセッサは明らかに非標準的な方法で動作します。だからそれを削除したほうがいい。また、Windows 9xサポートマクロであり、標準またはMicrosoft固有のいずれかに拡張されます。だからそれも捨てなさい。最後に、標準の最後にある必要はありません。これは、のデフォルトの戻り値だからです。また、それは何ですか?あなたは例えばまたはを書きますか?ただそれを呼んだほうがいいです。それで、_tmainmainwmainreturn 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 に答える
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 に答える