首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态私有成员计数器

静态私有成员计数器
EN

Stack Overflow用户
提问于 2012-11-16 02:48:42
回答 3查看 404关注 0票数 0

最新情况:

好的,我在头文件中有以下新行:

代码语言:javascript
复制
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文件中:

代码语言:javascript
复制
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

给了我一个错误:静态的void::display()是私有的。的挑战是我只添加私有成员,而不触及接口例程:(朋友函数是要避免的。有什么想法吗?

原始员额::

我在“//我的成员”部分下更新静态计数器变量时有问题

规则:“不更改、添加或删除接口给定代码的成员。如果需要,可以添加私有成员,但不允许进行其他更改。”

我的问题是如何在不创建新的公共功能的情况下更新私人成员?我知道我需要一个静态私有成员函数来访问一个静态私有成员变量。但是,每当我试图访问静态私有计数器变量时,我都会得到一个错误“未定义的.引用”。例如,gcdStats的这个私有计数器函数(声明为静态)将给我这样一个错误:

代码语言:javascript
复制
void Rationalnumber::gcdStatsCounter() {
    gcdStats++;
}

头文件:

代码语言:javascript
复制
#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__

更新::见顶部

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-16 02:58:50

您只声明了静态成员,还没有定义它们。

通常,对于静态变量,需要在类定义中声明它们,然后在外部定义它们,例如:

代码语言:javascript
复制
class Rationalnumber
{

    static float f;
    //...

};

编辑:当然,定义应该放在.cpp文件中,而不是头文件中。这样做的原因是为了避免多个定义,如果头文件包含在多个源文件中,就会发生这种情况。链接器的任务是初始化静态对象,下面的行基本上告诉链接器它存在,以及如何处理它。

代码语言:javascript
复制
//In Rationalnumber.cpp:
float Rationalnumber::f; //Allow default initialization
float Rationalnumber::f(5.0); //Initialize with non-default value
票数 3
EN

Stack Overflow用户

发布于 2012-11-16 02:54:24

这是上学用的吗?

也许你的老师想让你发现好友关键字。

票数 0
EN

Stack Overflow用户

发布于 2012-11-16 02:58:55

在标头中声明静态方法:

静态孔隙gcdStatsCounter();

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13409648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档