创建一个对象的实例 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 是参数的名称。所以成员得到了参数值,一切都很好。

您应该始终在构造函数中使用初始化列表。除了允许重复名称(如果这是你喜欢的;许多程序员不喜欢)之外,当你拥有具有更复杂初始化的数据成员时,它们会更有效。