0

メインクラス

#include "List.h"
#include "Worker.h"
#include <iostream>
#include <string>

using namespace std;
void initWorkerList(List<Worker>);

int main() {
    List<Worker> WorkerList; // Error highlighted here
    initWorkerList(WorkerList);

    string username, password;
    cout << "Please enter your username: " << endl;
    getline(cin, username);
    cout << "Please enter your password: " << endl;
    getline(cin, password);

    Worker w;
    bool success = w.login(username,password, WorkerList);
    if(success) {
             // code

    } else {
        cout << "Invalid username and/or password. \nPlease try again!";
    }

    system("pause");
    return 0; }

void initWorkerList(List<Worker> WorkerList) {
    Worker w1 = Worker("Ben Ang", "Ben123", "pass123", 'M');
    WorkerList.add(w1);
    Worker w2 = Worker("Grace Eng", "Gr4ce", "loveGrace", 'W');
    WorkerList.add(w2);
    Worker w3 = Worker("Rebecca Xuan", "Xuanz", "Rebecca Xuan", 'W');
    WorkerList.add(w3); }

労働者階級

#include <string>
#include "List.h"
using namespace std;
class Worker { private:
    string name;
    string username;
    string password;
    char position; public:
    Worker();
    Worker(string, string, string, char);
    string getName();
    string getUserName();
    string getPassword();
    char getPosition();
    bool login(string, string, List<Worker>); };

Worker::Worker() {   }

Worker::Worker(string n, string un, string pw, char p) {
    name = n;
    username = un;
    password = pw;
    position = p; }

string Worker::getName() {
    return name; }

string Worker::getUserName() {
    return username; }

string Worker::getPassword() {
    return password; }

char Worker::getPosition() {
    return position; }

bool login(string username, string password, List<Worker> WorkerList) {
    string u, pw;
    for(int i =0; i<WorkerList.length(); i++) {
        Worker w = WorkerList.get(i);
        u = w.getUserName();
        pw = w.getPassword();
        if(username == u && password == pw) {
            return true;
        }
    }
    return false; }

リストクラス

#include <iostream>
using namespace std;

const int MAX_SIZE = 20;

template <typename ItemType> class List { private:
    ItemType itemList[MAX_SIZE];
    int size; public: 
    List();
    void add(ItemType);
    void del(int index);
    bool isEmpty();
    ItemType get(int);
    int length(); };


template<typename ItemType> List<ItemType>::List() {
    size = 0; }

template<typename ItemType> void List<ItemType>::add(ItemType item) {
    if(size < MAX_SIZE) {
        itemList[size] = item;
        size++; 
    } 
    else {
        cout << "List is full.\n";
    } }

template<typename ItemType> void List<ItemType>::del(int index) {
    if(!isEmpty()) {
        if(index > 0 && index < size) {
            for(int i = index + 1; i <= size; i++) {
                itemList[i-2] = itemList[i-1];
            }
            size--;
        }
    } else {
        cout << "List is empty.\n";
    } }

template<typename ItemType> bool List<ItemType>::isEmpty() {
    return size == 0; }

template<typename ItemType> ItemType List<ItemType>::get(int index) {
    if(index > 0 && index <= size) 
        return itemList[index-1]; }

template<typename ItemType>
int List<ItemType>::length() {
    return size;
}

多くのエラーがありますが、これが他のエラーの原因でもあると思います。

エラー 11 エラー C2133: 'WorkerList': 不明なサイズ

エラーはメイン セクションで見つかりました。私も理由はわかりません。以前はまだ機能していましたが、これは奇妙です...では、何が問題なのですか?

4

3 に答える 3

2

loginWorker クラスの関数はフリー スタンド関数です。実装していませんWorker::login

変化する

bool login(string username, string password, List<Worker> WorkerList)

bool Worker::login(string username, string password, List<Worker> WorkerList)

また#include List.h"、いくつかのエラーを生成する複数のエラーがあり、複数の定義識別子が に示されていますList.h。慣用的な方法は、ヘッダーにインクルード ガードを提供することです。

例えば:

#ifndef LIST_H
#define LIST_H

#include <iostream>
using namespace std;

#define MAX_SIZE 20

// .... other source code

template<typename ItemType>
int List<ItemType>::length() {
    return size;
}

#endif
于 2013-01-13T01:53:17.623 に答える
2
ItemType itemList[MAX_SIZE];

あなたの問題があると思います。動的に割り当てられた配列に置き換えるか、 に置き換えることを検討してconst int MAX_SIZE = 20;ください#define

于 2013-01-13T01:55:46.690 に答える
2

ヘッダーに複数の包含ガードを追加すると、g++ (Mac OS X 10.7.5 の G++ 4.7.1) から得られる唯一のコンパイル警告は次のとおりです。

$ g++ -O3 -g -I/Users/jleffler/inc -std=c++11 -Wall -Wextra -c so14299529.cpp
In file included from Worker.h:6:0,
                 from so14299529.cpp:2:
List.h: In member function ‘ItemType List<ItemType>::get(int) [with ItemType = Worker]’:
List.h:49:35: warning: control reaches end of non-void function [-Wreturn-type]
$

ヘッダー ガードがないと、次のような多くのエラーが発生します。

In file included from Worker.h:6:0,
                 from so14299529.cpp:2:
List.h:7:11: error: redefinition of ‘const int MAX_SIZE’
In file included from so14299529.cpp:1:0:
List.h:7:11: error: ‘const int MAX_SIZE’ previously defined here
In file included from Worker.h:6:0,
                 from so14299529.cpp:2:
List.h:9:36: error: redefinition of ‘class List<ItemType>’
In file included from so14299529.cpp:1:0:
List.h:9:36: error: previous definition of ‘class List<ItemType>’
In file included from Worker.h:6:0,
                 from so14299529.cpp:2:
List.h:20:29: error: redefinition of ‘List<ItemType>::List()’
In file included from so14299529.cpp:1:0:
List.h:20:29: error: ‘List<ItemType>::List()’ previously declared here
In file included from Worker.h:6:0,
                 from so14299529.cpp:2:
List.h:23:34: error: redefinition of ‘void List<ItemType>::add(ItemType)’
In file included from so14299529.cpp:1:0:
List.h:23:34: error: ‘void List<ItemType>::add(ItemType)’ previously declared here
In file included from Worker.h:6:0,
                 from so14299529.cpp:2:
List.h:32:34: error: redefinition of ‘void List<ItemType>::del(int)’
In file included from so14299529.cpp:1:0:
List.h:32:34: error: ‘void List<ItemType>::del(int)’ previously declared here
In file included from Worker.h:6:0,
                 from so14299529.cpp:2:
List.h:44:34: error: redefinition of ‘bool List<ItemType>::isEmpty()’
In file included from so14299529.cpp:1:0:
List.h:44:34: error: ‘bool List<ItemType>::isEmpty()’ previously declared here
In file included from Worker.h:6:0,
                 from so14299529.cpp:2:
List.h:47:38: error: redefinition of ‘ItemType List<ItemType>::get(int)’
In file included from so14299529.cpp:1:0:
List.h:47:38: error: ‘ItemType List<ItemType>::get(int)’ previously declared here
In file included from Worker.h:6:0,
                 from so14299529.cpp:2:
List.h:52:5: error: redefinition of ‘int List<ItemType>::length()’
In file included from so14299529.cpp:1:0:
List.h:52:5: error: ‘int List<ItemType>::length()’ previously declared here
List.h: In member function ‘ItemType List<ItemType>::get(int) [with ItemType = Worker]’:
List.h:49:35: warning: control reaches end of non-void function [-Wreturn-type]

ヘッダー ガードは、ヘッダーが複数回含まれないようにするためのシンプルで信頼性の高い手法です。

したがって、IMO による適切な修正は、以下に示すように、各ヘッダーの上部に 2 行、下部に 1 行を追加することです。

List.h

#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED

... Original content of header ...

#endif /* LIST_H_INCLUDED */

Worker.h

#ifndef WORKER_H_INCLUDED
#define WORKER_H_INCLUDED

... Original content of header ...

#endif /* WORKER_H_INCLUDED */

ヘッダー ガードの前にコメントを入れることはできますが、それ以外はできません。すべての操作コードは、ヘッダー ガード内にある必要があります。

于 2013-01-13T02:00:23.937 に答える