链接列表中的虚函数 - 多种返回类型(对象)
Virtual functions within link list's - multiple return types (object)
我在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
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");
希望它能帮助某人!
- 当函数返回类型为父类时,如何返回子类的对象?
- 有没有办法根据运行时值的类型返回 constexpr 对象
- 为什么C++ std::min_element 库函数接受采用布尔返回类型的函数对象的函子,而不是像 C 中那样的 in
- 自动返回类型的函数可以返回同级对象
- 访问lambda尾随返回类型中的概括捕获对象
- 是否可以通过从lambda的引用中返回T型对象,而无需使用尾随返回类型语法
- 链接列表中的虚函数 - 多种返回类型(对象)
- 返回类型,或如何保留对象指针的类型
- 标准库对象作为返回类型和函数参数
- 关于 std::tuple 对象上 std:get() 的返回类型的混淆
- 使用方法捕获模板化可调用对象的返回类型
- 如何创建返回类型为 1) 真/假和 2) 动态数据的对象
- 嵌套类中的"无效协变返回类型"错误,该方法返回基于模板的对象
- 一个类的对象作为另一个类的方法的返回类型
- 返回对象或NULL的返回类型
- 获取模板化对象方法的返回类型
- 为什么在返回从函数的返回类型派生的类型本地对象时不选择 move 构造函数?
- 使用c++11 auto作为const函数对象的返回类型
- 返回类型而不是对象如何有效,误解代码片段
- 获取不带对象的成员函数的返回类型