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

时间:2012-11-03 02:11:07

标签: c++ linked-list virtual

我在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) -

- 上下文问题 -

(我不确定即时通过提供节点和列表代码概念我们已经给出了 - 我说这是因为我无法理解节点存储对象的内存地址的位置。除非我误解它和节点是一个它扩展的每个类的子代,所以它继承了该类的所有内容,并将其内容添加到顶部?如果是这样的话,为什么我们需要在第一个位置创建虚函数,如果我们继承了所有的功能 - 安全性?)< / p>

- 包含存储在其中的对象的指针。现在我实际上卡住了加载数据 - 好吧把它全部加载到列表中,但我只加载了外键作为字符串,因为我需要基本上检查字符串FK对存储在存储的对象的PK以前的文件iv加载(演讲很容易,给了我们一个简单的1-8流程,其中1没有FK :))然后当我发现该对象获取其内存地址并将其用作FK。这背后的想法是你基本上可以去std :: cout&lt;&lt; departmentObj-&GT; getForeignKey() - &GT;则getIdentifier();我发布了一些代码来自我的测试项目(切断测试),因为我不确定我是否制作了任何版权。

- 抱歉,这里的代码块是bugging,所以它必须是粘贴bin。

List.cpp http://pastebin.com/Le3fz5YF

List.h http://pastebin.com/5yJYDM8N

Node.cpp http://pastebin.com/Pgas8eju

Node.h http://pastebin.com/TZPrEA4Q

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

dep.cpp http://pastebin.com/G2yk6jCg

Main.cpp的 http://pastebin.com/npiCC6wX

refrence loader http://pastebin.com/n6UdsYmW

所以基本上归结为通过列表返回所需对象的内存地址。显然我没有得到如何正确访问节点和列表类来执行此操作。我希望能够做到这一点的方式只是简单地有一行很好的代码,我可以用它来替换我的加载器中的addnode行(这篇文章的帖子就是参考),它看起来像这样:

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

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

我不确定我是不是很有意思,我希望有人可以帮助我。 谢谢你的时间!! - 快速编辑,忘记dep和fac.cpp的

2 个答案:

答案 0 :(得分:1)

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

在任何情况下,除非你已经继承了你的Node类,否则该类没有继承:Node没有扩展任何东西,并且(据我所知)没有任何扩展Node。此外,您编写它的方式,Node包含指向另一个节点的指针,但没有其他数据。如果您更改了Node.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;
}

然后,您就可以在每个节点中存储内容。您可能不希望数据的类型为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中定义的副本,因为它被声明为virtual。如果使用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进行子类化,以便在不同类型的节点中存储不同类型的数据。

希望这有帮助!

答案 1 :(得分:0)

嘿嘿认为id回弹并发布解决方案,以防任何人在将来感到奇怪。因为我处理数据类型,我知道我决定使用的返回值:

void * getMe();

void *因为您可能知道或者可能不知道是指向mem地址的指针。然后你可以使用

转换它

(学部*)facultyList-&GT; getPkMemAdd( “PK”);

希望它有所帮助!!