C ++中类的静态结构指针声明

时间:2020-06-03 23:06:59

标签: c++ pointers static

给出以下代码段:

   /* 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存储为结构对象而不是指向该结构对象的指针会更容易,但是很好奇它是如何工作的。谢谢。

2 个答案:

答案 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;

Live Demo