gpt4 book ai didi

c++ - 链接列表中的虚函数 - 多个返回类型(对象)

转载 作者:太空宇宙 更新时间:2023-11-04 12:03:19 25 4
gpt4 key购买 nike

我在 uni 有一个作业要做,基本上,我们从许多 txt 文件中获取一堆数据。数据以一种可以读取的方式进行结构化,对于这个问题,我将其分解为两个文件和两个类。数据示例如下:

Faculty.txt(PK,姓名)

AT  Advanced Technology 
HESAS Health, Sport and Science

Department.txt (PK, Name, FK)

ET  Engineering and Technology  AT  
BE Built Environment AT
CMS Computing and Mathematical Sciences AT
SAS Science and Sport HESAS
CS Care Sciences HESAS
PESD Professional Education and Service Delivery HESAS

想法是使用数据创建报告,该程序旨在使用链接列表、关系和虚函数。所以在代码中我们基本上有一个节点列表(我使用 FILO)-

-断章取意的问题-

(我不确定我是否得到了讲座提供的节点和我们已经给出的列表代码概念 - 我这样说是因为我无法理解节点存储对象内存地址的位置。除非我误解它并且节点是一个它扩展了每个类的子类,因此它继承了该类的所有内容并在顶部添加了它的东西?如果是这种情况,为什么我们需要在第一个位置创建一个虚拟函数,如果我们继承了所有功能 - 安全性?)

-其中存储了对象的指针。现在我实际卡住的地方是加载数据 - 好吧 iv 将它全部加载到列表中,但我只加载了外键作为字符串,因为我需要基本上检查字符串 FK 与存储在中的对象的 PK之前的文件 iv 加载(讲座很简单,给了我们一个简单的 1-8 流程,其中 1 没有 FK:))然后当我找到那个对象时,获取它的内存地址并将其用作 FK。这背后的想法是你基本上可以去 std::cout << departmentObj->getForeignKey()->getIdentifier();我现在从我的测试项目(为了测试而砍掉)中发布一些代码,因为我不确定我是否在做任何降神会。

-- 抱歉,这里的代码块有问题,所以它必须是 paste bin。

列表.cpp http://pastebin.com/Le3fz5YF

列表.h http://pastebin.com/5yJYDM8N

节点.cpp http://pastebin.com/Pgas8eju

节点.h http://pastebin.com/TZPrEA4Q

Fac.cpp http://pastebin.com/0EGeGhdq

部门.cpp http://pastebin.com/G2yk6jCg

main.cpp http://pastebin.com/npiCC6wX

引用加载器 http://pastebin.com/n6UdsYmW

所以基本上归结为通过列表返回所需对象的内存地址。显然我不知道如何正确访问节点和列表类来执行此操作。我希望能够做到这一点的方法只是简单地拥有一行漂亮的代码,我可以用它来替换我的加载器中的 addnode 行(我会发布它以供引用)它看起来像这样:

departmentList->AddNode(new Department(holder[0], holder[1], facultyList->getPkObjAdd(holder[2])));

但是问题在于如何返回对象的内存地址。如果它必须是一个虚函数,我如何允许它返回多个对象类型,例如 faculty 和 department?

我不确定我是否做了很多降神会,我希望有人能帮助我。谢谢你的时间!!- 快速编辑,忘记 dep 和 fac.cpp 的

最佳答案

您是否包含了所有代码?看起来您缺少一些文件(Fac.cpp 包括 Fac.h,但您似乎没有发布)。

在任何情况下,除非您对 Node 类进行子类化,否则该类不会继承:Node 不会扩展任何内容,并且(据我所知)没有任何内容会扩展 Node。此外,按照您的编写方式,Node 包含指向另一个 Node 的指针,但没有其他数据。如果您更改了 Node.h header ,使其看起来像:

#pragma once
#include <iostream>
#include "string"

using namespace std;

class Node
{
public:
Node();
Node(Node* next);
~Node(void);

// Member Functions
Node* GetNextNode();
void SetNextNode(Node* next);
void * GetData();
void SetData(void* data);

// Virtual Functions
virtual void DisplayContents() = 0;
virtual string getIdentifier() = 0;
virtual PROBLEM getMe() = 0;

private:
Node* nextNode;
void* data;
};

然后添加函数GetData和SetData:

void SetData(void *data)
{
this.data = data;
}

void * GetData()
{
return this.data;
}

然后您就可以在每个节点中存储一些东西。您可能不希望数据的类型为 void*,您可能希望存储字符串。但思路是一样的。

至于虚函数,这个想法纯粹与继承有关。虚函数的思想是一个对象总是调用它自己版本的函数,而不是它父类的版本。所以如果你有:

class Base
{
public:
virtual void virtualFunc();
void otherFunc();
};

class Derived : public Base
{
public:
virtual void virtualFunc();
void otherFunc();
};

我将这样定义这些函数:

#include "inheritance.h"
#include <iostream>
using namespace std;

void Base::virtualFunc()
{
cout << "in Base::virtualFunc" << endl;
}

void Base::otherFunc()
{
cout << "in Base::otherFunc" << endl;
}

void Derived::virtualFunc()
{
cout << "in Derived::virtualFunc" << endl;
}

void Derived::otherFunc()
{
cout << "in Derived::otherFunc" << endl;
}

然后你在某处创建一些对象:

Derived *derived1 = new Derived();
Base *derived2 = new Derived();

如果您在 derived1 或 derived2 上调用 virtualFunc(),它将始终调用 Derived 中定义的拷贝,因为它被声明为虚拟的。如果使用 derived1 调用 otherFunc(),它将调用 Derived 中定义的版本,因为 derived1 被声明为 Derived 类型。但是,derived2 被声明为 Base,因此如果您调用它的 otherFunc(),则会调用 Base 中定义的拷贝。因此,如果您有以下代码:

#include "inheritance.h"
#include <iostream>
using namespace std;
int main()
{
Derived *derived1 = new Derived;
Base *derived2 = new Derived;

cout << "calling virtualFunc() with derived1: ";
derived1->virtualFunc();

cout << "calling virtualFunc() with derived2: ";
derived2->virtualFunc();

cout << "calling otherFunc() with derived1: ";
derived1->otherFunc();

cout << "calling otherFunc() with derived2: ";
derived2->otherFunc();

delete derived1;
delete derived2;

}

你会得到这样的输出:

calling virtualFunc() with derived1: in Derived::virtualFunc
calling virtualFunc() with derived2: in Derived::virtualFunc
calling otherFunc() with derived1: in Derived::otherFunc
calling otherFunc() with derived2: in Base::otherFunc

在你的Node类中,你定义了一些纯虚函数,这是一个特殊的。这些在类定义中设置为 0,其想法是在您的基类(在本例中为 Node)中,您无法定义它们的功能。相反,您是说任何派生类都必须为这些函数定义功能。请注意,您不能直接使用纯虚函数创建类的对象。如果您有一个未定义这些函数的派生类,您将无法直接创建该类型的对象,您也需要以某种方式对其进行子类化才能做到这一点。

我猜想对于这个作业,您应该以几种不同的方式对 Node 进行子类化,以便在不同类型的节点中存储不同类型的数据。

希望这对您有所帮助!

关于c++ - 链接列表中的虚函数 - 多个返回类型(对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13205325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com