0

アップデート::

OK、ヘッダーファイルに次の新しい行があります。

static void gcdStatsCounter();//increments counter
static void display(); // displays the gcdStats
static int gcdStats;//• calls to gcd

public:                                  // interface routines
        static void statistics();              // print statistics

次に、cppファイルに追加しました。

int Rationalnumber::gcdStats(0);//initialization

void Rationalnumber::gcdStatsCounter() { // counter incrementer
    gcdStats++;
}

void Rationalnumber::display() {// displays the gcdStats
    cout << "gcdStats = " << Rationalnumber::gcdStats << endl;
}

void statistics() {
    Rationalnumber::display();
}                       // print statistics

それは私にエラーを与えています:static void Rationalnumber :: display()はprivateです。課題は、プライベートメンバーを追加するだけで、インターフェイスルーチンには触れないことです:(フレンド関数は避けてください。何かアイデアはありますか?

元の投稿::

セクションの下の静的カウンター変数の更新に問題があります:// MY MEMBERS

ルール:「インターフェースのGIVENコードのメンバーを変更、追加、または削除しないでください。必要に応じてプライベートメンバーを追加できますが、他の変更は許可されません。」

私の問題は、新しいパブリック関数を作成せずにプライベートメンバーを更新するにはどうすればよいですか?静的プライベートメンバー変数にアクセスするには、静的プライベートメンバー関数が必要であることを理解しています。ただし、静的プライベートカウンター変数にアクセスしようとすると、「...への未定義の参照」というエラーが発生します。たとえば、gcdStatsのこのプライベートカウンター関数(静的として宣言)では、次のようなエラーが発生します。

void Rationalnumber::gcdStatsCounter() {
    gcdStats++;
}

ヘッダーファイル:

#ifndef RATIONALNUMBER_H
#define RATIONALNUMBER_H
#include <iostream>
// HEADER FILE

class Rationalnumber
{
    friend bool operator==( Rationalnumber l, Rationalnumber r );
    friend bool operator!=( Rationalnumber l, Rationalnumber r );
    friend bool operator<( Rationalnumber l, Rationalnumber r );
    friend bool operator<=( Rationalnumber l, Rationalnumber r );
    friend bool operator>( Rationalnumber l, Rationalnumber r );
    friend bool operator>=( Rationalnumber l, Rationalnumber r );

    friend Rationalnumber operator+( Rationalnumber l, Rationalnumber r );
    friend Rationalnumber operator-( Rationalnumber l, Rationalnumber r );
    friend Rationalnumber operator*( Rationalnumber l, Rationalnumber r );
    friend Rationalnumber operator/( Rationalnumber l, Rationalnumber r );

    friend std::istream &operator>>( std::istream &is, Rationalnumber &r );
    friend std::ostream &operator<<( std::ostream &os, Rationalnumber r );

    int num, denom;                        // implementation


    // MY MEMBERS

    // functions
    static int gcd(int n, int d); // for the gcd function
    static void zeroDenom(); // is called whenever denom = 0

    // variables
    // object stats:
    // The first four statistics vary depending on the implementation approach
    static void gcdStatsCounter();
    static int gcdStats;//• calls to gcd
    static int con;     //• rational-number objects created by regular constructors
    static int copy;    //• rational-number objects created by copy constructor
    static int des;     //• rational-number objects destroyed by destructor

    //operation stats:
    // must be consistent across implementations
    static int assn;    //• assignments to rational-number objects
    static int rel;     //• relational/equality operations between rational-number objects
    static int add;     //• addition/subtraction operations between rational-number objects
    static int sub;
    static int mul;     //• multiplication/division operations between rational-number objects
    static int div;
    static int in;      //• input/output operations on rational-number objects
    static int out;


  public:                                  // interface routines
    Rationalnumber();
    Rationalnumber( int n );
    Rationalnumber( int n, int d );
    Rationalnumber( const Rationalnumber &c ); // copy constructor
    ~Rationalnumber();

    int numerator() const;                 // return numerator
    int numerator( int n );                // set numerator to n; return previous numerator
    int denominator() const;               // return denominator
    int denominator( int d );              // set denominator to d; return previous denominator

    Rationalnumber operator-();            // unary negation
    Rationalnumber &operator=( const Rationalnumber &r ); // assignment

    static void statistics();              // print statistics

}; // Rationalnumber

#endif // __RATIONALNUMBER_H__

UPDATE :: SEE TOP

4

3 に答える 3

3

静的メンバーを宣言しただけで、定義していません。

通常、静的変数では、クラス定義内で宣言してから、外部で定義する必要があります。次に例を示します。

class Rationalnumber
{

    static float f;
    //...

};

編集: もちろん、定義はヘッダー ファイルではなく .cpp ファイルに入れる必要があります。これは、ヘッダー ファイルが複数のソース ファイルに含まれている場合に発生する複数の定義を避けるためです。リンカは静的オブジェクトを初期化する役割を担っており、以下の行は基本的に、それが存在することとそれをどうするかをリンカに伝えます。

//In Rationalnumber.cpp:
float Rationalnumber::f; //Allow default initialization
float Rationalnumber::f(5.0); //Initialize with non-default value
于 2012-11-16T02:58:50.577 に答える
0

これは学校用ですか?

たぶん、あなたの先生は友達のキーワードを見つけてほしいと思っています。

于 2012-11-16T02:54:24.583 に答える
0

ヘッダーで静的メソッドを宣言します。

static void gcdStatsCounter();

于 2012-11-16T02:58:55.577 に答える