如何解决创建对象 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 用于检查是否为料斗),然后是 id、位置、方向(1-4)、大小和活动(0/1) )
我有一个抽象的 Bug 类,然后我有一个 Crawler 和 Hopper 类,它们都继承自 Bug 类。
这是我的Bug类
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 Crawler : public Bug
{
public:
Crawler(int id,int size)
: Bug("Crawler",id,position,direction,size,alive)
{
}
};
以下是我尝试创建 Crawler 对象实例的示例:
Bug* bugPtr;
if (bugType == "C") {
bugPtr = new Crawler(bugID,{ xPos,yPos },size);
//Crawler* CrawlerBugPointer = new Crawler(bugID,size);
}
我能够轻松地从文本文件中读取并存储变量,但是当我开始调试 bugPtr 中的所有字段时说 0,我怀疑我以完全错误的方式处理事情并且没有构建抽象类和继承类正确,有人能指出我做错了什么吗?任何帮助将不胜感激。
解决方法
编译器应该为构造函数中的每一行生成一个警告,“可能没有效果的表达式”(或类似的)。阅读警告 - 它们很有用。
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
的类字段并将本地 id
的值分配给它。”
这样做的方法是使用初始化列表:
Bug(string type,bool alive)
: type(type),id(id),position(position),direction(direction),size(size),alive(alive)
{ }
原始代码的问题是名称隐藏。在构造函数体中,type = type
只是将名为 type
的参数的值分配给名为 type
的参数。它不会更改名为 type
的成员的值。
但是在初始化列表中,在像 type(type)
这样的条目中,第一个 type
是成员的名称,第二个 type
是参数的名称。所以成员得到了参数值,一切都很好。
您应该总是在构造函数中使用初始化列表。除了允许重名(如果这是您喜欢的;许多程序员不这样做),当您拥有更复杂初始化的数据成员时,它们会更有效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。