В robots.hpp у меня есть class
, robots
. Я хочу, чтобы каждый робот имел указатель на другой робот, тот, который был объявлен последним. Я также хочу, чтобы у каждого был уникальный идентификатор. Для этого у меня есть переменная, которая подсчитывает количество роботов.Неопределенная ссылка на защищенный статический член. Как это решить?
Кажется, что я не могу инициализировать свои статические переменные в определении класса. Я посмотрел, как это решить, и нашел что-то, рекомендующее инициализировать их в robots.cpp. Тем не менее, это дает мне ошибку, говоря, что они защищены, и поэтому я не могу этого сделать. Итак, теперь у меня есть функция, вызываемая конструктором только один раз, в начале.
Однако, что дает мне ошибку, говоря, что я не могу этого сделать, потому что они еще не определены.
Определение класса в robots.hpp:
class robot
{
public:
///initialiser.
robot();
[...]
///initialises all robots
void initrobots();
///id of robot
const uint_least8_t id=NumOfRobots++;
static bool hasBeenInitialised;
protected:
///number of robots.
static uint_least8_t NumOfRobots;
///pointer to the next robot that needs pointing to.
static robot* poiRobot;
[...]
///pointer to next robot
robot* nextRobot;
};
robots.cpp:
bool robot::hasBeenInitialised=false;
void robot::initrobots(){
poiRobot=NULL;
NumOfRobots=0;
}
robot::robot(){
if(!hasBeenInitialised){
initrobots();
hasBeenInitialised=true;
}
[...]
}
код, который генерирует эту ошибку заключается в следующем:
#include <cstdint>
#include <cstdlib>
class robot
{
public:
///initialiser.
robot();
//[...]
///initialises all robots
void initrobots();
///id of robot
const uint_least8_t id=NumOfRobots++;
static bool hasBeenInitialised;
protected:
///number of robots.
static uint_least8_t NumOfRobots;
///pointer to the next robot that needs pointing to.
static robot* poiRobot;
//[...]
///pointer to next robot
robot* nextRobot;
};
bool robot::hasBeenInitialised=false;
void robot::initrobots(){
poiRobot=NULL;
NumOfRobots=0;
}
robot::robot(){
if(!hasBeenInitialised){
initrobots();
hasBeenInitialised=true;
}
}
int main(){
return 0;
}
Если я скомпилировать его он не жалуется, но он жалуется, если я его построю (используя geany, чтобы делать вещи отдельно, C++ 11 standard (в противном случае cstdint жалуется))
Я хотел бы код, чтобы сделать poiRobot
указатель null
и NumofRobots
равен 0.
Можете ли вы создать [mcve], где вы показываете, как вы пытались инициализировать элемент? – NathanOliver
Я просто попытался скомпилировать 'class Test {protected: static int x; }; int Test :: x = 2; 'в GCC и работает отлично. – Frank
Защищенность не должна иметь значения; 'robot * robot :: poiRobot;' должен работать так же хорошо, как определение 'hasBeenInitialised'. Если это не так, отправьте код, создающий ошибку, вместе с копией сообщения об ошибке (не перефразируйте, используйте «Копировать» и «Вставить»). – molbdnilo