静态函数里面的静态变量?

时间:2012-10-04 23:26:42

标签: c++ static

Java String Literal Pool的简单C ++模拟

您好,

我无法在MyString类中使用私有静态变量进行调用。有什么想法吗?

static void displayPool() {
    MyString::table->displayAllStrings();
}
StringTable* (MyString::table) = new StringTable();

这两个都是在MyString类中声明的。 table是一个私有变量。

感谢。

编辑:headerfile

#ifndef MYSTRING_H
#define MYSTRING_H

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
#define POOLSIZE 100

class StringTable {
 public:
    StringTable();
    int addString(const char *str);
    char* getString(int i);
    void deleteString(int i);
    void displayAllStrings();
    void addCount(int);
    void minusCount(int);
 private:
    char** array; //da pool
    int* count;
    int size;
    int numStrings;
};

class MyString {
 public:
   MyString(const char*);
   MyString(const MyString&);
   ~MyString();
   static void displayPool();
   MyString& operator=(const MyString &);
   char* intern() const;
 private:
   int length;
   int index;
   static StringTable* table;
   friend MyString operator+(const MyString& lhs, const MyString& rhs);
   friend ostream& operator<<(ostream & os, const MyString & str);
 }; 

#endif

4 个答案:

答案 0 :(得分:6)

static void displayPool() {
    MyString::table->displayAllStrings();
}

这不符合你的想法。它定义了自由函数displayPool。关键字static所做的就是将函数保持为定义函数的源文件的本地函数。你想要的是定义静态成员函数MyString::displayPool()

void MyString::displayPool() {
    table->displayAllStrings();
}

MyString::之前displayPool是必不可少的。您不希望在此处使用static关键字;添加那将是一个错误。最后,请注意MyString::无需限定table。静态成员函数可以查看所有静态数据成员,而无需进行限定。您需要限定table的唯一原因是,是否存在名为table的全局变量;那么table就会含糊不清。

答案 1 :(得分:1)

在这种情况下你想要的是:

void MyString::displayPool() {
    MyString::table->displayAllStrings();
}

答案 2 :(得分:0)

如果你想在静态函数中使用静态变量,你应该这样做:

static void displayPool() {
    static StringTable* table = new StringTable();

    table->displayAllStrings();
}

但是我觉得问题可能是要求你为某个类创建一个静态方法。您可能想重新阅读该问题。

答案 3 :(得分:0)

你宣布了

StringTable* table;
带有公共访问说明符的MyString的类定义中的