2009-06-07 147 views
3

在Visual Studio 2008中出现以下错误:错误C2248:'Town :: Town':无法访问类'Town'中声明的私有成员。它看起来像构造函数无法访问它自己的类的成员。任何想法发生了什么? 下面的代码:构造函数不能访问自己类的私有成员

我有这样的:

template<class T> class Tree{...} 

这个类:

class Town{ 
    Town(int number):number(number){}; 
    ... 
private: 
    int number; 
}; 

这也是使用的这个类:

class Country{ 
public: 
    StatusType AddTown(Shore side, int location, int maxNeighborhoods); 
private: 
    Tree<Town> towns[2]; 
    ... 
} 

而这里的AddTown功能:

StatusType Country::AddTown(Shore side, int location, int maxNeighborhoods){ 
    if (maxNeighborhoods<0 || location<0){ 
     return INVALID_INPUT; 
    } 
    Town* dummy= new Town(location);//Here be error C2248 
    if (towns[side].find(*dummy)!=NULL){ 
     delete dummy; 
     return FAILURE; 
    } 
    SouthBorder* dummyBorder; 
    (side==NORTH)?dummyBorder=new SouthBorder(location,0):dummyBorder=new SouthBorder(0,location); 
    if (southBorders.find(*dummyBorder)!=NULL){ 
     delete dummyBorder; 
     return FAILURE; 
    } 
    towns[side].add(*dummy); 
    delete dummyBorder; 
    return SUCCESS; 
} 

回答

12

默认类的访问级别是私有的。如果你不添加public:在Town构造函数之前它将是私有的。

class Town{ 
public: // <- add this 
    Town(int number):number(number){}; 
    ... 
private: 
    int number; 
}; 
+1

谢谢。这是一个愚蠢的错误...... – 2009-06-07 19:25:02

-1

您申报隐藏成员变量的函数的局部变量:

城区(INT数):号码(号码){};

试试这个

Town(int num):number(num){};

+1

初始化列表对此有点特别。在初始化列表中,具有相同名称的参数不会隐藏属性。只要有可能,该参数将隐藏该属性的名称。当编译器遇到':number(number)'时,第一个'number'必须是代码编译的属性。第二个“数字”可以是任意的,并且参数隐藏该属性(如构造函数块中的任何位置)。但是OP代码是正确的。 – 2009-06-07 19:37:51

3

此代码有上面列出的逻辑问题。非公开声明和隐藏通过使用相同名称作为内部传递的成员变量。

考虑到我们正在谈论'数字'变量作为例子。

在过去,比如在私有内部变量的C++成员变量中,前缀为“m_number”。或者有些人会做'_number'。

只是'num'是一个很好的重命名,但它可能并不清楚,它只是相同的值。我想这是一个内部私有成员变量命名的问题,并没有真正解决。

Python使用'self.number',它可以区分传入的'number',这是一个体面的解决方案。

但是无论平台如何,拥有一个私有变量成员命名系统总是很好,它可以帮助您避免在名称冲突点出现黑客攻击。

+1

+1的一般想法。但是,虽然常见,但不应在前缀中加下划线'_',因为标准将这些名称保留在'实现'中,其中实现是编译器/ STL实现者。您也可以在C++中使用'this',就像您在python中使用'self'来区分属性与其他标识符(局部变量/参数)一样。 – 2009-06-07 20:18:45