0

編集:これは解決されました。私の 2 番目のコーディングを見て、リンカー エラーの問題を修正するために編集された内容を確認してください。可能であれば、このスレッドを閉じてください。回答/応答/フィードバックをありがとう<3

関数 getvalue() を使用して、企業の総売上 (Year_Sales) を返すために、プライベート静的変数にアクセスしようとしています。私は関数をトリガーしようとしています

cout << DivisionSale[0].getvalue();

しかし、次のエラーが表示されます...

[リンカー エラー] 未定義の参照。プライベート静的変数

これがプロジェクトの私のコーディングです

#include <iostream>

using namespace std;

// class declaration

class DivSales  // The 6 divisions will use this

{

      private:
              // Holds the total corporate sales for all divisions
              static int Year_Sales;

      public:
              static int Qtrsale[4]; // Elements for sale figures, 4 quarterly sales
              static void AddSales (int,int,int,int); // calculates annual ammount
              int Sales(int); // output
              static int getvalue() { return Year_Sales; } 

};

// This member function takes arguments and is copied into array holding sales data

// Year_Sales contains total of the 4 sales

void DivSales::AddSales(int sale1, int sale2, int sale3, int sale4)

{

      // arrays 0 through 3 store the quarterly sales
      Qtrsale[0] = sale1;
      Qtrsale[1] = sale2;
      Qtrsale[2] = sale3;
      Qtrsale[3] = sale4;

      // private variable access
      // combines the 4 arguments
      Year_Sales = Year_Sales + sale1 + sale2 + sale3 + sale4;

}

// returns values of quarterly sales for each division

// Used for table formatting in main

int DivSales::Sales(int n)

{

    // Qtrsale[n] holds value from input to return for output

    // returns sale(n) 

    int value = Qtrsale[n];
    return value;

}

// this function is triggered if user enters a negative quarterly sale value

void error()

{

     system("cls");
     cout << "You have entered a negative value. Restart program and try again";
     cout << "Press any key to restart program\n";
     system("pause");
     exit(0);

}

// Overload constructer

// Definition of the static member of DivSales class

// for access to the private static variable

int DivSales::Year_Sales = 0;

// Start main function

int main()

{

    // insurance for protecting the array storage(s)
    const int DS = 6;   
    DivSales DivisionSale[DS];  // 6 division with each of their own array
    int quarter, division; // quarter = 4; division = 6

    // This will pass quarter sales to AddSales
    for (division = 0; division < 6; division++)
    {
        // 4 quarters for array storage
        int Qrt1, Qrt2, Qrt3, Qrt4;

        int Q; // used to check for negative input

        // Prompts the user for quarter sales of each division
        // divisions 1 - 6
        cout << "Enter Sales of Division: " << division + 1 << endl;

        // Each quarter is assigned to Q which is used for error checking.
        // Error checking occurs when negative value is detected
        cout << "Enter Q1 Sales: ";
        cin >> Qrt1;
        Q = Qrt1;
        if (Q < 0)
           error();

        cout << "Enter Q2 Sales: ";
        cin >> Qrt2;
        Q = Qrt2;
        if (Q < 0)
           error();

        cout << "Enter Q3 Sales: ";
        cin >> Qrt3;
        Q = Qrt3;
        if (Q < 0)
           error();

        cout << "Enter Q4 Sales: ";
        cin >> Qrt4;
        Q = Qrt4;
        if (Q < 0)
           error();

        // passes Qrt1 through Qrt4 to AddSales
        DivisionSale[division].AddSales(Qrt1,Qrt2,Qrt3,Qrt4);
    }

    cout << "----------------------------------------\n";
    cout << "\t" << "Q1" << "\t" << "Q2" << "\t" << "Q3" << "\t" << "Q4" << endl;

    // table for quarterly sales of each division
    for (division = 0; division < 6; division++)
    {
        cout << "Div " << division + 1;
        for (quarter = 0; quarter < 4; quarter++)
        {
            // calling function Sales 6 times
            cout << "\t" << DivisionSale[division].Sales(quarter);
            cout << endl;
        }
    }

    cout << "----------------------------------------\n";
    cout << "\n Total All Division Sales for the Year: ";
    cout << DivisionSale[0].getvalue();       

    system("pause");
    return 0;

}

そして、これが私がする必要があることです:

企業には 6 つの部門があり、それぞれが異なる地理的な場所への販売を担当しています。次のメンバーを使用して、部門の売上データを保持する DivSales クラスを設計します。

• 部門の売上高の 4 つの四半期を保持するための 4 つの要素を持つ配列

• 1 年間のすべての部門の全社売上高を保持するためのプライベート静的変数。

• 4 つの引数を取るメンバー関数。それぞれが四半期の売上と見なされます。引数の値は、売上データを保持する配列にコピーする必要があります。4 つの引数の合計を、年間の企業売上合計を保持する静的変数に追加する必要があります。

• 0 から 3 の範囲内の整数引数を取る関数。引数は、分割四半期売上配列への添字として使用されます。関数は、その添え字を持つ配列要素の値を返す必要があります。

6 つの DivSales オブジェクトの配列を作成するプログラムを作成します。プログラムは、部門ごとに 4 四半期の売上を入力するようユーザーに要求する必要があります。データが入力されると、プログラムは各四半期の部門の売上を示すテーブルを表示する必要があります。プログラムは、その年の企業の総売上高を表示する必要があります。

入力の検証: 四半期ごとの売上高の正の値のみを受け入れます。

リンカ エラーは、私の邪魔をしている唯一のエラーです。コードの最適化が行われる可能性があることは承知していますが、リンカー エラーを修正する必要があります。

編集: 静的なものと静的でないものを改訂し、int DivSales::Year_Sales を使用

新しいコーディング:

#include <iostream>

using namespace std;

// class declartion

class DivSales  // The 6 divisions will use this

{

      private:
              // Holds the total corporate sales for all divisions
              static int Year_Sales;
              int Qtrsale[4]; // Elements for sale figures, 4 quarterly sales

      public:
              void AddSales (int,int,int,int); // calculates annual ammount
              int Sales(int); // output
              int getvalue() { return Year_Sales; }

};

// This member function takes arguments and is copied into array holding sales data

// Year_Sales contains total of the 4 sales

void DivSales::AddSales(int sale1, int sale2, int sale3, int sale4)

{

      // arrays 0 through 3 store the quarterly sales
      Qtrsale[0] = sale1;
      Qtrsale[1] = sale2;
      Qtrsale[2] = sale3;
      Qtrsale[3] = sale4;

      // private variable access
      // combines the 4 arguments
      Year_Sales = Year_Sales + sale1 + sale2 + sale3 + sale4;

}

// returns values of quarterly sales for each division

// Used for table formatting in main

int DivSales::Sales(int n)

{

    // Qtrsale[n] holds value from input to return for output
    // returns sale(n) 
    int value = Qtrsale[n];
    return value;

}

// this function is triggered if user enters a negative quarterly sale value

void error()

{

     system("cls");
     cout << "You have entered a negative value. Restart program and try again";
     cout << "Press any key to restart program\n";
     system("pause");
     exit(0);

}

// Overload constructer

// Definition of the static member of DivSales class

// for access to the private static variable

int DivSales::Year_Sales;


// Start main function

int main()

{

    // insurance for protecting the array storage(s)
    const int DS = 6;   
    DivSales DivisionSale[DS];  // 6 division with each of their own array
    int quarter, division; // quarter = 4; division = 6

    // This will pass quarter sales to AddSales
    for (division = 0; division < 6; division++)

    {

        // 4 quarters for array storage
        int Qrt1, Qrt2, Qrt3, Qrt4;

        int Q; // used to check for negative input

        // Prompts the user for quarter sales of each division
        // divisions 1 - 6
        cout << "Enter Sales of Division: " << division + 1 << endl;

        // Each quarter is assigned to Q which is used for error checking.
        // Error checking occurs when negative value is detected
        cout << "Enter Q1 Sales: ";
        cin >> Qrt1;
        Q = Qrt1;
        if (Q < 0)
           error();

        cout << "Enter Q2 Sales: ";
        cin >> Qrt2;
        Q = Qrt2;
        if (Q < 0)
           error();

        cout << "Enter Q3 Sales: ";
        cin >> Qrt3;
        Q = Qrt3;
        if (Q < 0)
           error();

        cout << "Enter Q4 Sales: ";
        cin >> Qrt4;
        Q = Qrt4;
        if (Q < 0)
           error();

        // passes Qrt1 through Qrt4 to AddSales
        DivisionSale[division].AddSales(Qrt1,Qrt2,Qrt3,Qrt4);

    }

    cout << "\n----------------------------------------\n";
    cout << "\t" << "Q1" << "\t" << "Q2" << "\t" << "Q3" << "\t" << "Q4" << endl;

    // table for quarterly sales of each division
    for (division = 0; division < 6; division++)

    {

        cout << "Div " << division + 1;
        for (quarter = 0; quarter < 4; quarter++)

        {

            // calling function Sales 6 times
            cout << "\t$" << DivisionSale[division].Sales(quarter);

        }

        cout << endl;

    }

    cout << "----------------------------------------\n";
    cout << "\nTotal corporate sales for the year: ";
    cout << "$" << DivisionSale[0].getvalue() << endl;      

    system("pause");
    return 0;

}
4

1 に答える 1

0

どこかに変数の定義が必要です。

int DivSales::Qtrsale[4];

クラスに宣言がありますが、プロジェクトのどこかに (1 つの場所に) 定義も必要です。

これは C++ の FAQ に違いありませんが、今すぐ調べるのが面倒です。

于 2012-05-08T00:24:04.503 に答える