大家晚上好,我只是想知道我是否有正确的类文件。当谈到指针和类时,我真的很沙哑。我研究了指针,但我认为自己很困惑。我知道指针的作用和使用它们的重点,但实际上使用它们并传递它们让我感到困惑。
该课程的进一步描述如下:
“这个类保存了迷宫中房间的信息。每个房间对象由四个段落指针(每个方向一个),一个名称和该房间中的项目列表组成。除了参数化构造函数,这个类应该有以下方法:
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
在
Room::Room(std::string name, Passage *northPassage, Passage
*eastPassage, Passage *southPassage, Passage *westPassage) {
this -> name = name;
}
参数northPassage
,eastPassage
,southPassage
和westPassage
与成员变量之间没有联系
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();
}
所以你的问题是关于指针和类?
在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.
您必须了解计算机如何工作的基础知识,否则您总会发现指针令人困惑。