- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 uni 有一个作业要做,基本上,我们从许多 txt 文件中获取一堆数据。数据以一种可以读取的方式进行结构化,对于这个问题,我将其分解为两个文件和两个类。数据示例如下:
AT Advanced Technology
HESAS Health, Sport and Science
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/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!