2

Java字符串文字池的简单C++模拟

你好,

我无法从 MyString 类中的私有静态变量进行调用。任何想法?

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

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

谢谢。

编辑:头文件

#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

4 回答 4

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

这不是在做你认为它在做的事情。它正在定义自由功能displayPool。关键字static所做的只是将函数保持在定义函数的源文件的本地。你想要的是定义静态成员函数MyString::displayPool()

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

前面是必不可少MyString::的。displayPool您不想要static这里的关键字;添加这将是一个错误。最后,请注意,不需要MyString::to 限定table。静态成员函数无需限定即可查看所有静态数据成员。您需要限定的唯一原因table是是否有一个名为table;的全局变量。那么table将是模棱两可的。

于 2012-10-04T23:51:27.493 回答
1

在这种情况下,您想要的是以下内容:

void MyString::displayPool() {
    MyString::table->displayAllStrings();
}
于 2012-10-04T23:44:15.847 回答
0

你声明了吗

StringTable* table;

在带有公共访问说明符的 MyString 的类定义中?

于 2012-10-04T23:34:32.850 回答
0

如果你想在你的静态函数中有一个静态变量,你应该这样做:

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

    table->displayAllStrings();
}

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

于 2012-10-04T23:30:16.197 回答