[英]Static private member counter
更新::
好的,所以我在头文件中有这些新行:
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()是私有的。 我面临的挑战是仅添加私有成员,而不接触接口例程:(要避免使用Friend函数。有什么想法吗?
原始帖子::
我在更新以下部分的静态计数器变量时遇到问题://我的成员
规则:“请勿更改,添加或删除接口的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
您仅声明了静态成员,尚未定义它们。
通常,对于静态变量,您需要在类定义中声明它们,然后在类外部定义它们,例如:
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
这是上学吗?
也许您的老师希望您发现朋友关键字。
在标头中声明您的静态方法:
静态无效gcdStatsCounter();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.