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

Virtual functions within link list's - multiple return types (object)

本文关键字:返回类型 对象 列表 函数 链接      更新时间:2023-10-16

我在uni中有一个分配要做,基本上,我们从许多TXT文件中收集了许多数据。数据的结构是可以读取的,因为这个问题将其切成两个文件和两个类。数据的一个示例是:

ccyulty.txt(pk,name)

AT  Advanced Technology 
HESAS   Health, Sport and Science   

decr验
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   

这个想法是使用数据创建报告,该程序旨在使用链接列表,关系和虚拟功能。因此,在代码中,我们基本上有一个节点的列表(IM使用Filo) -

- 上下文问题 -

(我不确定即时通知提供的节点和列表代码概念 - 我这么说是因为我无法在Node存储对象的内存地址的位置。除非IM误解它,并且Node是一个每个类的孩子都会扩展,因此它从该类中继承了所有内容并将其内容添加到最上方?如果是这样,为什么我们需要在第一名中执行虚拟函数,如果我们继承了所有功能 - 安全性?)

- 其中有许多对象的指针。现在,我实际上卡住的地方正在加载数据 - 井IV将其全部加载到列表中,但是我只将外键加载为字符串,因为我需要基本上将字符串FK与存储在该对象的PK上进行检查先前的文件IV加载(讲座很容易,并给了我们一个简单的1-8流,其中1个没有FK :)),然后当我发现该对象获取其内存地址并将其用作FK时。这背后的想法是您基本上可以转到std :: cout<<DepartmentObj-> getForeignkey() -> getIdentifier();此时,我的测试项目中发布了一些代码(切碎进行测试),因为我不确定我是否在做任何seance。

- 对不起,这里的代码块正在漏洞,因此必须是粘贴bin。

list.cpphttp://pastebin.com/le3fz5yf

list.hhttp://pastebin.com/5yjydm8n

node.cpphttp://pastebin.com/pgas8eju

node.hhttp://pastebin.com/tzprea4q

fac.cpphttp://pastebin.com/0egeghdq

dep.cpphttp://pastebin.com/g2yk6jcg

main.cpphttp://pastebin.com/npicc6wx

转化装载机http://pastebin.com/n6udsymw

基本上,它归结为通过列表返回所需对象的内存地址。显然,我没有得到如何访问节点并正确列表类以执行此操作。我希望能够做到这一点的方式只是拥有一条不错的代码行,可以用来替换加载程序中的addNode线(以供参考),它看起来像这样:

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

但是,这个问题在于如何返回对象的内存地址。如果必须是虚拟函数,我该如何允许其返回多个对象类型(例如教师和部门)?

我不确定我是否在做太多的seance,我希望有人可以帮助我。谢谢你的时间!! - 快速编辑,忘记dep和fac.cpp的

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

在任何情况下,除非您将节点类别分类为子,否则该类没有任何继承:节点不会扩展任何内容,并且(据我所知)没有任何扩展节点。另外,您写它的方式,节点包含一个指向另一个节点的指针,但没有其他数据。如果您更改了节点。H头,以便看起来像:

#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;
}

您将能够在每个节点中存储一些东西。您可能不希望数据类型无效*,您可能想存储字符串。但是这个想法是相同的。

至于虚拟函数,这个想法纯粹与继承有关。使用虚拟函数的想法是,一个对象将始终调用其自己的函数版本,而不是其父类的版本。因此,如果您有:

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();

如果您在dedived1上或派生2上调用virtualfunc(),它将始终调用派生中定义的副本,因为它被声明为虚拟。如果您使用dedived1调用其他func(),则将调用派生中定义的版本,因为派生1被声明为类型派生。但是,派生2被声明为基础,因此,如果您调用其其他func(),则基本中定义的副本将被调用。因此,如果您有以下代码:

#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

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

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

希望这会有所帮助!

hey thoughthow thows ID弹出并发布解决方案,以使任何人在以后都有疑问。由于我要处理我决定使用的返回值的数据类型:

void* getme();

void*,您可能会或不知道是MEM地址的Apointer。然后,您可以使用

转换它

(教师*)院子 -> getpkmemadd(" pk");

希望它能帮助某人!