创建一个对象的实例 C++
Create an instance of an object C++
我最近开始学习 C++,但我在某些方面遇到了问题,因为我已经习惯了 Java,我不确定我是否以正确的方式处理事情。
我有一个文本文件,其中的行结构如下
C;101;1;1;4;10;
H;102;9;0;1;8;2
C;103;9;9;2;5;
C;104;0;9;3;8;
;作为分隔符
C用来判断是不是Crawler(H是用来判断是不是Hopper),后面是id,positions,directions(1-4),size,alive(0) /1)
我有一个抽象 Bug class 然后我有一个 Crawler 和 Hopper class 它们都继承自 Bug class.
这是我的 Bug class
class Bug
{
public:
int id;
pair<int, int> position;
int direction;
int size;
bool alive;
list<pair<int, int>> path;
virtual void move() {}
bool isWayBlocked() {}
Bug(string type, int id, pair <int, int> position, int direction, int size, bool alive)
{
type = type;
id = id;
position = position;
direction = direction;
size = size;
alive = alive;
};
};
这是爬虫class
class Crawler : public Bug
{
public:
Crawler(int id, pair <int, int> position, int direction, int size)
: Bug("Crawler", id, position, direction, size, alive)
{
}
};
这是我尝试创建 Crawler 对象实例的示例:
Bug* bugPtr;
if (bugType == "C") {
bugPtr = new Crawler(bugID, { xPos,yPos }, direction, size);
//Crawler* CrawlerBugPointer = new Crawler(bugID, { xPos,yPos }, direction, size);
}
我能够轻松地从文本文件中读取并存储变量,但是当我开始调试 bugPtr 中的所有字段时说 0,我怀疑我以完全错误的方式处理事情并且没有正确构建了 Abstract class 和 Inheritor classes,有人能指出我做错了什么吗?任何帮助将不胜感激。
编译器应该为构造函数中的每一行生成警告“表达式可能无效”(或类似的)。阅读警告 - 它们很有用。
Bug(string type, int id, pair <int, int> position, int direction, int size, bool alive)
{
this->type = type;
this->id = id;
this->position = position;
this->direction = direction;
this->size = size;
this->alive = alive;
};
虽然 C++ 不需要在任何地方荒谬地使用 this
,但在您的情况下,这是必要的,因为您已经为构造函数参数指定了与字段相同的名称。当您输入类似
的内容时
id = id;
你是说,“在这个作用域中找到名称为 id
的变量,并将它的值赋给它自己。”什么都不做,这就是为什么您的所有字段都保留为默认值的原因。说 this.id
的意思是,“找到名称为 id
的 class 字段并将本地 id
的值分配给它。”
执行此操作的方法是使用初始化列表:
Bug(string type, int id, pair <int, int> position, int direction, int size, bool alive)
: type(type), id(id), position(position), direction(direction), size(size), alive(alive)
{ }
原代码的问题是名称隐藏。在构造函数主体中,type = type
只是将名为 type
的参数的值分配给名为 type
的参数。它不会更改名为 type
.
的成员的值
但是在初始化列表中,在像 type(type)
这样的条目中,第一个 type
是成员的名称,第二个 type
是参数的名称。所以成员得到了参数值,一切都很好。
您应该始终在构造函数中使用初始化列表。除了允许重复名称(如果这是你喜欢的;许多程序员不喜欢)之外,当你拥有具有更复杂初始化的数据成员时,它们会更有效。
我最近开始学习 C++,但我在某些方面遇到了问题,因为我已经习惯了 Java,我不确定我是否以正确的方式处理事情。
我有一个文本文件,其中的行结构如下
C;101;1;1;4;10;
H;102;9;0;1;8;2
C;103;9;9;2;5;
C;104;0;9;3;8;
;作为分隔符
C用来判断是不是Crawler(H是用来判断是不是Hopper),后面是id,positions,directions(1-4),size,alive(0) /1)
我有一个抽象 Bug class 然后我有一个 Crawler 和 Hopper class 它们都继承自 Bug class.
这是我的 Bug class
class Bug
{
public:
int id;
pair<int, int> position;
int direction;
int size;
bool alive;
list<pair<int, int>> path;
virtual void move() {}
bool isWayBlocked() {}
Bug(string type, int id, pair <int, int> position, int direction, int size, bool alive)
{
type = type;
id = id;
position = position;
direction = direction;
size = size;
alive = alive;
};
};
这是爬虫class
class Crawler : public Bug
{
public:
Crawler(int id, pair <int, int> position, int direction, int size)
: Bug("Crawler", id, position, direction, size, alive)
{
}
};
这是我尝试创建 Crawler 对象实例的示例:
Bug* bugPtr;
if (bugType == "C") {
bugPtr = new Crawler(bugID, { xPos,yPos }, direction, size);
//Crawler* CrawlerBugPointer = new Crawler(bugID, { xPos,yPos }, direction, size);
}
我能够轻松地从文本文件中读取并存储变量,但是当我开始调试 bugPtr 中的所有字段时说 0,我怀疑我以完全错误的方式处理事情并且没有正确构建了 Abstract class 和 Inheritor classes,有人能指出我做错了什么吗?任何帮助将不胜感激。
编译器应该为构造函数中的每一行生成警告“表达式可能无效”(或类似的)。阅读警告 - 它们很有用。
Bug(string type, int id, pair <int, int> position, int direction, int size, bool alive)
{
this->type = type;
this->id = id;
this->position = position;
this->direction = direction;
this->size = size;
this->alive = alive;
};
虽然 C++ 不需要在任何地方荒谬地使用 this
,但在您的情况下,这是必要的,因为您已经为构造函数参数指定了与字段相同的名称。当您输入类似
id = id;
你是说,“在这个作用域中找到名称为 id
的变量,并将它的值赋给它自己。”什么都不做,这就是为什么您的所有字段都保留为默认值的原因。说 this.id
的意思是,“找到名称为 id
的 class 字段并将本地 id
的值分配给它。”
执行此操作的方法是使用初始化列表:
Bug(string type, int id, pair <int, int> position, int direction, int size, bool alive)
: type(type), id(id), position(position), direction(direction), size(size), alive(alive)
{ }
原代码的问题是名称隐藏。在构造函数主体中,type = type
只是将名为 type
的参数的值分配给名为 type
的参数。它不会更改名为 type
.
但是在初始化列表中,在像 type(type)
这样的条目中,第一个 type
是成员的名称,第二个 type
是参数的名称。所以成员得到了参数值,一切都很好。
您应该始终在构造函数中使用初始化列表。除了允许重复名称(如果这是你喜欢的;许多程序员不喜欢)之外,当你拥有具有更复杂初始化的数据成员时,它们会更有效。