给出以下代码段:
/* trie.h file */
using namespace std;
#include <list>
typedef struct tn {
char ch;
list<struct tn*> ptrs;
} TrieNode;
class Trie {
public:
static const TrieNode* EMPTY;
//... other member functions
};
/* trie.cpp file */
#include "trie.h"
// declare, define static variables of the Trie class
TrieNode* Trie::EMPTY = (TrieNode*) malloc( sizeof(TrieNode) ); // <-- seems to work fine
// the statements below seem to yield errors
Trie::EMPTY->ch = '.';
Trie::EMPTY->ptrs = nullptr;
如果尝试实例化静态常量变量EMPTY
的struct成员变量,则会收到错误消息:“此声明没有存储类型或类型说明符”。我知道将EMPTY
存储为结构对象而不是指向该结构对象的指针会更容易,但是很好奇它是如何工作的。谢谢。
答案 0 :(得分:0)
在命名空间(任何函数之外)中,您只能放置声明。
这些陈述:
Trie::EMPTY->ch = '.';
Trie::EMPTY->ptrs = nullptr;
不允许放置在命名空间中,因为它们不是声明。
此外,此声明:
Trie::EMPTY->ptrs = nullptr;
没有意义,因为对象ptrs
不是指针,并且无法从std::list
初始化nullptr
。
请注意,而不是C函数malloc()
,应使用C ++运算符new
。
此定义:
TrieNode* Trie::EMPTY = (TrieNode*) malloc( sizeof(TrieNode) );
也是不正确的,因为您忘记了指定限定词const
。
应该这样重写:
const TrieNode* Trie::EMPTY = new TrieNode { '.' };
这是一个演示程序
#include <iostream>
#include <list>
typedef struct tn {
char ch;
std::list<struct tn*> ptrs;
} TrieNode;
class Trie {
public:
static const TrieNode* EMPTY;
//... other member functions
};
// the definition below must be placed in a cpp module
// it presents here only for demonstration.
const TrieNode* Trie::EMPTY = new TrieNode { '.' };
int main()
{
return 0;
}
退出程序之前,应释放分配的内存。
您可以使用智能指针std::unique_ptr
代替原始指针。
答案 1 :(得分:0)
您不能在全局范围内放置smb=np.array(ff['SMB'])
和noImplicitThis
之类的语句,它们只能在函数,构造函数等内部执行。
尝试更多类似方法:
Trie::EMPTY->ch = '.';
Trie::EMPTY->ptrs = nullptr;