Статический частный счетчик

ОБНОВИТЬ::

Итак, у меня есть эти новые строки в заголовочном файле:

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 () является приватным. Для меня задача состоит только в том, чтобы добавить приватных членов и не трогать процедуры интерфейса 🙁 Следует избегать функций друзей. Есть идеи?

ОРИГИНАЛЬНАЯ ПОЧТА ::

У меня проблемы с обновлением статических переменных счетчика в разделе: // МОИ ЧЛЕНЫ

Правила: «Не изменяйте, не добавляйте и не удаляйте элементы кода 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__

ОБНОВЛЕНИЕ :: СМОТРЕТЬ ТОП

0

Решение

Вы только объявили свои статические члены, вы не определили их.

Как правило, для статических переменных вам необходимо объявить их внутри определения класса, а затем определить их снаружи, например:

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
3

Другие решения

Это для школы?

Может быть, ваш учитель хочет, чтобы вы обнаружили друг ключевое слово.

0

Объявите ваш статический метод в заголовке:

static void gcdStatsCounter ();

0
По вопросам рекламы [email protected]