构造函数无法访问其自己的类的私有成员

时间:2009-06-07 19:17:19

标签: c++ visual-studio-2008 templates

我在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;
}

3 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:3)

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

考虑到我们所说的'数字'变量就是一个例子。

在过去,例如在c ++成员变量中,私有内部变量将以'm_number'为前缀。或者有些人只会'_number'。

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

Python使用'self.number'来区分传递的'number',这是一个不错的解决方案。

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

答案 2 :(得分:-1)

您为隐藏成员变量的函数声明了一个局部变量:

  

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

试试这个

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