1

私はC++のクラスとオブジェクトについて学び、それを正しく理解しているかどうかをテストするために次のコードを試しました。

#include <iostream>

using namespace std;

class class1
{
    public:
        void write(int x)
        {
             dataObject.var = x;
        }
};

class class2
{
    public:
        void read()
        {
            std::cout << dataObject.var;
        }
};

class data
{
    public:
        int var;
        data()
        {
            var = 1;
        }
};

int main()
{
    data dataObject;
    class1 object1;
    class2 object2;


    object2.read(data dataObject);
    object1.write(2);
    object2.read(data dataObject);

    return 0;
}

これは、2つのオブジェクトを使用して、3つ目のメンバーを変更および使用するためのものでしたが、次のエラーが発生します。

In member function 'void class1::write(int)':
line 10: error: 'dataObject' was not declared in this scope

In member function 'void class2::read()':
line 14: error: 'dataObject' was not declared in this scope

In function 'int main()':
line 40 + 42: error: expected primary-expression before 'dataObject'

私がどこで間違っているのか考えていますか?前もって感謝します。

編集:すべての提案をありがとう。私のコードは次のとおりです。

#include <iostream>

using namespace std;

class class1
{
    public:
        void write(data &dataObject, int x)
        {
            dataObject.var = x;
        }

};

class class2
{
    public:
        void read(data dataObject)
        {
            std::cout << dataObject.var << endl;
        }
};

class data
{
    public:
        int var;
        data()
        {
            var = 1;
        }
};

int main()
{
    data dataObject;
    class1 object1;
    class2 object2;


    object2.read(dataObject);
    object1.write(dataObject,2);
    object2.read(dataObject);

    return 0;
}    

そして、私は今エラーを受け取ります:

8エラー:「データ」が宣言されていません

10エラー:非クラスタイプの「int」である「dataObject」のメンバー「var」の要求

18エラー:「データ」が宣言されていません

20エラー:非クラスタイプの「int」である「dataObject」のメンバー「var」の要求

40エラー:「dataObject」はこのスコープで宣言されていません

4

3 に答える 3

5

あなたが間違っているのは、この時点でそれです:

    void write(int x)
    {
         dataObject.var = x;
    }

ありませんdataObject。クラスをグローバルオブジェクトに依存させようとしています。まず、本当にこれが必要かどうかを判断する必要があります。その場合、クラスで使用される前に、これらのグローバルオブジェクトが宣言およびインスタンス化されていることを確認する方法が必要です。

エラーを修正する方法はたくさんありますが、最初に、クラスに何をさせたいのか、クラスが互いにどのように相互作用するのかを明確にする必要があります。

グローバルオブジェクトなしでこれを修正する方法の一例:

class class1
{
  public:
    class1(data& dataObj) : dataRef_(dataObj) {}
    void write(int x)
    {
      dataRef_.var = x;
    }
  private:
    data& dataRef_;
};

次に、メインで:

int main()
{
  data dataObject;
  class1 object1(dataObject);
  object1.write(2);
}
于 2012-08-11T18:36:30.223 に答える
3

クラスは変数を認識していませんdataObject。それらがクラスのインスタンスにアクセスできるようにする場合は、dataそれらを関数に渡す必要があります。このような機能を再定義します

 void read(const data& dataObject)
 {
     std::cout << dataObject.var;
 }

dataまたは、これを実行できるようにする場合は、クラスにクラスのメンバー変数を設定します。設計の観点から、クラスはクラスデータのインスタンスに作用する以外に何もしません。data両方のクラスを組み合わせて、クラスのオブジェクトをメンバー変数として含む新しいクラスにすることができます。その新しいクラスの複数の関数(読み取り/書き込み)を使用して、内部dataメンバーの変更/出力を行うことができます。メンバー変数ではない別の変数を変更することだけを目的とする2つの別個のクラスを持つことは実際には意味がありません。

于 2012-08-11T18:36:40.227 に答える
0

readメンバー関数とにパラメーターを渡しますwriteが、これらの関数はパラメーターを受け入れるように定義されていません。

それらを次のように再定義します。

// for class1:
void write(data &dataObject, int x)
{
     dataObject.var = x;
}

// for class2:
void read(data dataObject)
{
    std::cout << dataObject.var << endl;
}

さらに、これらのオブジェクトを渡すときは、タイプのプレフィックスを付けないでdataください。すでに変数を宣言しているので、必要なのは次のことだけです。

int main()
{
    data dataObject;
    class1 object1;
    class2 object2;

    object2.read(dataObject);
    object1.write(dataObject, 2);
    object2.read(dataObject);
}
于 2012-08-11T18:42:46.553 に答える