正确的类文件?

问题描述 投票:-1回答:2

enter image description here

大家晚上好,我只是想知道我是否有正确的类文件。当谈到指针和类时,我真的很沙哑。我研究了指针,但我认为自己很困惑。我知道指针的作用和使用它们的重点,但实际上使用它们并传递它们让我感到困惑。

该课程的进一步描述如下:

“这个类保存了迷宫中房间的信息。每个房间对象由四个段落指针(每个方向一个),一个名称和该房间中的项目列表组成。除了参数化构造函数,这个类应该有以下方法:

GetName()返回Room的名称。

GetNorthPassage(),GetEastPassage(),GetSouthPassage(),GetWestPassage()这些方法中的每一个都返回指向相应Passage的指针。这允许调用诸如“someRoom-> GetNorthPassage() - > Open()”

AddItem(std :: string item)将项添加到Room对象的项向量中。

AcquireNextItem()当玩家进入房间时,他们应该收到该房间内的所有物品。

AcquireNextItem一次返回一个项目并将其从Room中删除。“

我对Room类的实现是:

// // Created by Johnny Mitchell on 3/3/2019. //

#include "Room.hpp"

Room::Room() {}

Room::Room(std::string name, Passage *northPassage, Passage
*eastPassage, Passage *southPassage, Passage *westPassage) {
    this -> name = name;
     }

std::string Room::GetName() {
    return room; }

Passage* Room::GetNorthPassage() {
    return northPassage; }

Passage* Room::GetEastPassage() {
    return eastPassage; }

Passage* Room::GetSouthPassage() {
    return southPassage; }

Passage* Room::GetWestPassage() {
    return westPassage; }

void Room::AddItem(std::string item) {
    items.push_back(item); }

std::string Room::AcquireNextItem() {
    while (items.empty() == false)
        return items.pop_back(); }

“Room.hpp”

//
// Created by Johnny Mitchell on 3/3/2019.
//

#ifndef MAZE_ROOM_HPP
#define MAZE_ROOM_HPP


#include <string>
#include <vector>
#include "Passage.hpp"

class Room {
private:
    std::string name;
    std::vector<string> items;

    Passage* northPassage;
    Passage* eastPassage;
    Passage* westPassage;
    Passage* southPassage;

public:
    Room();
    Room(std::string name, Passage*, Passage*, Passage*, Passage*);

    std::string GetName();

    Passage* GetNorthPassage();
    Passage* GetWestPassage();
    Passage* GetSouthPassage();
    Passage* GetEastPassage();

    void AddItem(std::string item);
    std::string AcquireNextItem();

};


#endif //MAZE_ROOM_HPP
c++ class pointers
2个回答
0
投票

Room::Room(std::string name, Passage *northPassage, Passage
*eastPassage, Passage *southPassage, Passage *westPassage) {
    this -> name = name;
     }

参数northPassageeastPassagesouthPassagewestPassage与成员变量之间没有联系

Passage* northPassage;
Passage* eastPassage;
Passage* westPassage;
Passage* southPassage;

这些参数不会自动设置同名的成员。你必须自己做。由于未设置成员,因此指针指向某个未定义的位置,这对您来说意味着什么也未定义。这是不好的。一旦你知道计算机是如何工作的,你就可以做一些有根据的猜测,不管它是什么,它都不会很好。即使看起来它正在做你想要的,也可能不会晚些。

参数northPassage和成员northPassage是恰好具有相同名称的完全不同的变量。这不是一个指针的东西,这是一个变量范围的东西。在Room::Room内部,northPassage指的是最近声明的标识符,它是参数。阅读Variable Shadowing了解更多信息。

将参数northPassage分配给成员northPassage的最佳方法是使用成员初始化列表,这可能是最不重要的C ++概念。

Room::Room(std::string name, 
           Passage *northPassage, 
           Passage *eastPassage, 
           Passage *southPassage, 
           Passage *westPassage):
               name(name),
               items(), // not strictly required here, but included for completeness.
               northPassage(northPassage), 
               eastPassage(eastPassage), 
               southPassage(southPassage), 
               westPassage(westPassage)
{
    // noting needed in here. Everything was done above
}

首选成员初始值设定项列表进行体内赋值,因为必须在进入构造函数体之前对类进行完全初始化。这对于指针和大多数原始数据类型无关紧要,因为它们的初始化是什么都不做,但对于需要初始化的类,如std::vector<string> items,将调用默认构造函数。如果您不想要默认构造,那么这种努力就会浪费掉。如果类没有默认构造函数,则成员初始值设定项列表是初始化类的唯一方法。如果您没有初始化无法初始化的成员,编译器会尖叫。这同样适用于任何继承的类。

不相关的附注:

当第一次遇到它时,真正令人惊讶的是当你将指针传递给变量时,变量通过引用传递。指针不是。指针是一个自动变量,其范围限定为函数并包含传入的地址的副本。如果更改地址的副本,将其指向其他位置,原始文件不受影响。所以类似于:

void gimmiepointer (MyDatatype * p)
{
    p = new MyDatatype();
}

只是泄漏了MyDatatype。指向它的指针超出范围,并在函数结束时丢失。

而是使用对指针的引用

void gimmiepointer (MyDatatype *& p)
{
    p = new MyDatatype();
}

或者传递任何内容并简单地返回新指针

MyDatatype * gimmiepointer ()
{
    return new MyDatatype();
}

0
投票

所以你的问题是关于指针和类?

在c ++中,当您定义类似int或任何类型的class之类的内容时,您只需命名一些内存地址并指定要保留的地址之后的字节数。

例如,当您定义int时,您告诉计算机保留4个字节的内存,例如从地址1234567开始。

指针指向内存中的位置。

为了详细说明,计算机存储器以字节为单位组织,每个字节为8位。每个字节都有一个代表其地址的id或数字。计算机中可能有数十亿个不同的字节地址,因为计算机可以有几千兆字节的内存。

指针指向内存中的位置或字节的地址。因为存在针对计算机存储的某些事物的标准化存储器大小,所以指针可以表示大于一个字节的东西。例如,整数是4个字节。

将指针想象成一个数字,当计算机在该存储器地址访问时,返回一些您需要的特定字节数。

使用指针,您可以从指针指向的内存地址开始读取一些字节,并更改这些字节的值。

现在,如果你想到一个类的指针,它实际上就像int一样。您可以使用您在类实例中命名的内存地址,例如:

class A{
};

A myclass; // This means myclass is allocated in memory starting at some number  eg 12345

或者您可以创建指向该类的指针,如:

class A{
};

A * myclass = new A(); //my class now has some memory value eg 12345 and there is a class object of type A at that address , exactly the same as the first example just different way of allocating memory.

您必须了解计算机如何工作的基础知识,否则您总会发现指针令人困惑。

© www.soinside.com 2019 - 2024. All rights reserved.