robots.hpp에서 나는 class
, robots
입니다. 각 로봇에게 마지막으로 선언 된 로봇에 대한 포인터를 갖기를 원합니다. 나는 또한 각각이 유일한 ID를 갖고 싶어한다. 이를 위해 로봇 수를 세는 변수가 있습니다.보호 된 정적 멤버에 대한 참조가 정의되지 않았습니다. 어떻게 해결합니까?
클래스 정의에서 정적 변수를 초기화 할 수없는 것 같습니다. 나는 그것을 해결하는 방법을 찾아 보았고, 로봇에서 로봇을 초기화하는 것을 추천했다. 그러나, 그것은 나에게 그들이 보호 받고있다라고 말하는 오류를 준다. 그래서 나는 그것을 할 수 없다. 그래서 지금은 처음에 생성자에 의해 한 번만 호출되는 함수가 있습니다.
그러나 아직 정의되지 않았기 때문에 내가 할 수 없다는 오류가 발생합니다.
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를 사용한다. cstdint는
내가 null
에 poiRobot
포인터를 만들기 위해 코드를 원하는, 그리고 NumofRobots
동일한
회원을 초기화하는 방법을 보여줄 수있는 곳에 [mcve]를 만들 수 있습니까? – NathanOliver
방금'class Test {protected : static int x; }; int Test :: x = 2;'GCC에서 잘 작동합니다. – Frank
보호는 전혀 중요하지 않습니다. 'robot * robot :: poiRobot; '는'hasBeenInitialised'의 정의와 마찬가지로 작동해야합니다. 그렇지 않으면 오류 메시지의 사본과 함께 오류를 생성하는 코드를 게시하십시오 (바꾸지 말고 복사 및 붙여 넣기 사용). – molbdnilo