コピー コンストラクターを使用して C++ 文字列を作成している行で segfault が発生しました。同様の問題をいくつか見てきましたが、それらはすべて、不適切な c++ 文字列オブジェクトを渡したことが原因です。生の文字列を渡しているだけなので、問題が何であるかわかりません。関連するコードのスニペットを貼り付けます (複数の異なるファイルから取得したため、少しごちゃごちゃしているように見える場合があります)。segfault は、Species クラスのデフォルト コンストラクターの 4 行目で発生します。
Species::Species(string _type) {
program_length = 0;
cout << _type << " 1\n";
cout << type << " 2\n";
type = string(_type);
}
Grid::Grid(int _width, int _height) {
*wall = Species("wall");
*empty = Species("empty");
turn_number = 0;
width = _width;
height = _height;
for(int a= 0; a < 100; a++)
for(int b = 0; b< 100; b++) {
Creature empty_creature = Creature(*empty,a,b,NORTH,this);
(Grid::map)[a][b] = empty_creature;
}
}
int main() {
Grid world = Grid(8,8);
}
class Grid {
protected:
Creature map[100][100];
int width,height;
int turn_number;
Species *empty;
Species *wall;
public:
Grid();
Grid(int _width, int _height);
void addCreature(Species &_species, int x, int y, Direction orientation);
void addWall(int x, int y);
void takeTurn();
void infect(int x, int y, Direction orientation, Species &_species);
void hop(int x, int y, Direction orientation);
bool ifWall(int x, int y, Direction orientation);
bool ifEnemy(int x, int y, Direction orientation, Species &_species);
bool ifEmpty(int x, int y, Direction orientation);
void print();
};
class Species {
protected:
int program_length;
string program[100];
string type;
public:
species(string _type);
void addInstruction(string instruction);
bool isWall();
bool isEmpty();
bool isEnemy(Species _enemy);
string instructionAt(int index);
string getType();
};
ウォールからポインターを削除して空にした後の更新されたコードを次に示します。奇妙なエラーが発生しました (「エラー: フィールド ウォールはグリッドのメンバーではありません」):
Grid::Grid(int _width, int _height) {
(Grid::wall) = Species("wall");
(Grid::empty) = Species("empty");
cout << (*wall).getType() << "\n";
turn_number = 0;
width = _width;
height = _height;
for(int a= 0; a < 100; a++)
for(int b = 0; b< 100; b++) {
Creature empty_creature = Creature(Grid::empty,a,b,NORTH,this);
(Grid::map)[a][b] = empty_creature;
}
}
class Grid {
protected:
Creature map[100][100];
int width,height;
int turn_number;
Species empty;
Species wall;
public:
Grid();
Grid(int _width, int _height);
void addCreature(Species &_species, int x, int y, Direction orientation);
void addWall(int x, int y);
void takeTurn();
void infect(int x, int y, Direction orientation, Species &_species);
void hop(int x, int y, Direction orientation);
bool ifWall(int x, int y, Direction orientation);
bool ifEnemy(int x, int y, Direction orientation, Species &_species);
bool ifEmpty(int x, int y, Direction orientation);
void print();
};