robots.hppにはclass
,robots
があります。私は各ロボットに、最後に宣言された別のロボットへのポインタを持たせたい。私はまた、それぞれが一意のIDを持つことを望みます。これには、ロボットの数を数える変数があります。保護された静的メンバーへの未定義参照。どうすれば解決できますか?
私はクラス定義で静的変数を初期化できないようです。私はそれを解決する方法を探し、ロボットでそれらを初期化することを推奨するものを見つけました。しかし、それは私に彼らが保護されているというエラーを与え、私はそれをすることができません。だから私は最初にコンストラクタによって一度だけ呼び出される関数を持っています。
しかし、それはまだ定義されていないので、私はそれができないと言っているエラーを私に与えています。私はそれをコンパイルする場合
#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;
}
:
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;
}
[...]
}
このエラーを生成するコードはこれですそれは文句を言うことはありませんが、私はそれを構築すると文句を言うことはありません。 cstdintは
私はnull
へpoiRobot
ポインタを作るために、コードを希望し、NumofRobots
等しい
メンバの初期化の方法を示す[mcve]を作成できますか? – NathanOliver
私は 'class test {protected:static int x;}をコンパイルしようとしました。 }; int Test :: x = 2; 'GCCではうまく動作します。 – Frank
保護は全く重要ではありません。 'robot * robot :: poiRobot;'は 'hasBeenInitialised'の定義と同様に動作するはずです。そうでない場合は、エラーを生成するコードをエラーメッセージのコピーとともに掲示します(言い換えずに、コピーと貼り付けを使用してください)。 – molbdnilo