无法访问类中的 Struct 成员

Posted

技术标签:

【中文标题】无法访问类中的 Struct 成员【英文标题】:Can't access Struct member inside a class 【发布时间】:2014-12-11 05:05:52 【问题描述】:

我有课。类有一个结构_tree_branch_m 和一个类成员函数。该结构是成员函数的参数。在成员函数内部,访问结构成员时出错。我的结构有什么问题?错误是Field 'NodeType' 无法解决。

class CascadeClassifier


protected:
    typedef  char   *Set_m;
    typedef  struct _tree_branch_m *Tree_m;
    struct _tree_branch_m
    
            short   NodeType;   /* 0=leaf 1=branch 2=cut 3=subset */
            short   Leaf;       /* most frequent class at this node */
            float   Items,      /* no of items at this node */
                    *ClassDist, /* class distribution of items */
                    Errors;     /* no of errors at this node */
            short   Tested;     /* attribute referenced in test */
            short   Forks;      /* number of branches at this node */
            float   Cut,        /* threshold for continuous attribute */
                    Lower,      /* lower limit of soft threshold */
                    Upper;      /* upper limit ditto */
            Set_m   *Subset;    /* subsets of discrete values  */
            Tree_m  *Branch;    /* Branch[x] = (sub)tree for outcome x */
    ;

    virtual void ClassifyCase(Tree_m subtree, float Weight, float *LowClassSum, float *ClassSum);

;

void CascadeClassifier::ClassifyCase(Tree_m Subtree, float Weight, float *LowClassSum, float *ClassSum)

     if ( ! Subtree->NodeType )//error
     

     


【问题讨论】:

究竟是什么错误?在哪一行? 如果您在问题中使用了错误一词,请在问题中包含它。 这是不可重现的,请提供MCVE。 @jogojapan,这没关系,因为当他在函数参数中时,他已经在类的命名空间中。这只对前导返回类型很重要(但不是尾随类型,这就是它们存在的原因。) 抱歉添加了错误信息。错误是无法解析字段“NodeType”。谢谢 【参考方案1】:

3.3.2/6elaborated-type-specifier中首先声明的类的声明点如下:

——用于表单声明

class-key attribute-specifier-seq_opt 标识符;

标识符被声明为一个 class-name 在范围内 包含声明,否则

——用于详细类型说明符的形式

类键标识符

...标识符在最小的命名空间或块中声明 包含声明的范围。

当您编写typedef struct _tree_branch_m *Tree_m; 时,struct _tree_branch_m 向前声明了一个全局范围内的名称::_tree_branch_mTree_mCascadeClassifier::_tree_branch_m 没有任何关系。

您需要显式前向声明成员结构:

class CascadeClassifier
    struct _tree_branch_m;  // forward delcaration
    typedef _tree_branch_m *Tree_m;
    struct _tree_branch_m ...;
;

【讨论】:

谢谢,我在标准中寻找这个,你省了我的麻烦。所以他违反了保留的命名规则。这很有趣。【参考方案2】:

实际示例:http://ideone.com/OxaJVj

您在将结构分配给 typedef 的同时向前声明结构。我不知道这是否是犹太洁食,我必须检查标准。但是只需将这两个步骤分开就可以了:

typedef  struct _tree_branch_m *Tree_m;

struct _tree_branch_m;
typedef _tree_branch_m *Tree_m;

话虽如此,我建议不要使用前导下划线,因为即使您在技术上不违反标准,如果您要将 T 大写或放置第二个 _ 或将其移动到您的全局命名空间' d 违反保留名称。

【讨论】:

以上是关于无法访问类中的 Struct 成员的主要内容,如果未能解决你的问题,请参考以下文章

无法访问基类中的受保护成员 [重复]

在派生类中无法访问受保护的成员

在派生类中无法访问受保护的成员?

C++ 析构函数:无法访问类中声明的私有成员

使用受保护和继承时无法访问在类中声明的私有成员

java中的内部类