1

我在 uni 有一个任务要做,基本上,我们从许多 txt 文件中获取一堆数据。数据的结构是可以读取的,对于这个问题,我会把它分成两个文件和两个类。数据示例如下:

Faculty.txt(PK,名称)

AT  Advanced Technology 
HESAS   Health, Sport and Science   

Department.txt(PK,名称,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 与存储在上一个文件 iv 已加载(讲座很简单,给了我们一个简单的 1-8 流程,其中 1 没有 FK:))然后当我找到该对象时获取它的内存地址并将其用作 FK。这背后的想法是你基本上可以去 std::cout << departmentObj->getForeignKey()->getIdentifier(); 在这一点上我会从我的测试项目中发布一些代码(为了测试而砍掉),因为我不确定我是否在做任何降神会。

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

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

参考加载器 http://pastebin.com/n6UdsYmW

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

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

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

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

4

2 回答 2

1

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

在任何情况下,除非您将 Node 类子类化,否则该类不会继承: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 中定义的副本,因为它被声明为虚拟的。如果你用 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 进行子类化,以便将不同类型的数据存储在不同类型的节点中。

希望这可以帮助!

于 2012-11-03T02:55:50.153 回答
0

嘿,我想 id 会弹出并发布解决方案,以防将来有人想知道。因为我处理我决定使用的返回值的数据类型:

无效* getMe();

void* 你可能知道也可能不知道是指向内存地址的指针。然后你可以使用转换它

(教师*)教师列表->getPkMemAdd(“PK”);

希望它可以帮助某人!

于 2012-11-08T21:22:52.310 回答