I get the following error in Visual Studio 2008: error C2248: 'Town::Town' : cannot access private member declared in class 'Town'. It looks like the constructor is unable to access the members of its own class. Any idea what's going on? Here's the code:
I have this:
template<class T> class Tree{...}
And this class:
class Town{
Town(int number):number(number){};
...
private:
int number;
};
Which is used in this class:
class Country{
public:
StatusType AddTown(Shore side, int location, int maxNeighborhoods);
private:
Tree<Town> towns[2];
...
}
And here's the AddTown function:
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;
}
By default class access level is private. If you do not add a public: before the Town constructor it will be private.
class Town{
public: // <- add this
Town(int number):number(number){};
...
private:
int number;
};
This code had both the logic problems listed above. Both the non public declaration and the hiding of the member variables by using the same name passed as internal.
Considering we are talking about the 'number' variable as an example.
In the past such as in c++ member variables that were private internal variables would be prefixed with 'm_number'. Or some would do just '_number'.
Just 'num' is a good rename but it may not be clear that it is just the same value. I suppose this is a problem of internal private member variable naming that hasn't really been solved.
Python uses 'self.number' which would distinguish from 'number' passed in which is a decent solution.
But whatever the platform, it is always good to have a private variable member naming system that helps you to avoid hacks at the points that you have name collisions.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With