1

ここに私が試しているものの簡略版があります

#include <iostream>
using namespace std ;

class a
    {
    public:
    a(int xinit, int yinit){x=xinit; y=yinit;}

    private:
    int x, y;
    };

class b
    {
    public:
    b(int pinit, int qinit){p=pinit; q=qinit;}

    private:
    int p,q;
    a Test(p,q);
    };

int main()
    {
    return 0;
    }

コンパイルすると、「p」はタイプではありませんというエラーが表示されます。誰が何が悪いのか教えてもらえますか?

4

4 に答える 4

8

最も厄介な parsea Test(p,q);関数宣言として解析されます。あなたはそれを望んでいません(私は推測します)-代わりに、メンバーをとして宣言しa Test;、コンストラクター内で割り当てたいと考えています。

したがって、できることは、明示的に初期化することです。

public:
b(int pinit, int qinit): p(pinit), q(qinit), Test(p, q) { }
于 2013-06-03T10:37:51.307 に答える
2

この行で

a Test(p,q)

型を返し、型andの (匿名) 引数を取るメソッドを宣言します。あなたはおそらく使いたいと思っていました:apq

a Test(int p, int q);

クラス属性として宣言する場合は、クラス a のノンパラメトリック コンストラクターを作成する必要があります。

a() {}

そしてTest、コンストラクターで次のいずれかを初期化します。

b(int pinit, int qinit)
{
    p=pinit;
    q=qinit;
    Test=a(p,q);
}

または、初期化構文を使用します。

b(int pinit, int qinit):
    p(pinit),
    q(qinit),
    Test(pinit,qinit)
{
}
于 2013-06-03T10:37:43.250 に答える