1

私は大学で課題を抱えています。基本的に、多くのtxtファイルから大量のデータを取り込みます。この質問では、データを 2 つのファイルと 2 つのクラスに切り詰めることができないため、データは読み取り可能な方法で構造化されています。データの例は次のとおりです。

教員.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はそれをすべてリストにロードしましたが、外部キーを文字列としてロードしただけです.以前のファイル iv が読み込まれました (講義は簡単で、1 に FK がない簡単な 1-8 フローが得られました:)) そして、そのオブジェクトが見つかったら、そのメモリ アドレスを取得し、それを 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])));

しかし、問題はそのオブジェクトのメモリアドレスを返す方法にあります。仮想関数である必要がある場合、学部や学科などの複数のオブジェクト タイプを返せるようにするにはどうすればよいですか?

私は多くの交霊会を行っているかどうかわかりませんが、誰かが私を助けてくれることを願っています. 御時間ありがとうございます!!- クイック編集、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();

派生1または派生2でvirtualFunc()を呼び出すと、仮想として宣言されているため、常に派生で定義されたコピーが呼び出されます。派生 1 で otherFunc() を呼び出すと、派生 1 は派生型として宣言されているため、派生で定義されたバージョンが呼び出されます。ただし、派生 2 は 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* はメモリ アドレスへのポインタです。その後、次を使用して変換できます

(Faculty*)facultyList->getPkMemAdd("PK");

それが誰かを助けることを願っています!!

于 2012-11-08T21:22:52.310 に答える