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
答案 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的类定义中的?