Makefile C ++ наследование - PullRequest
1 голос
/ 24 июня 2011

Ниже приведены файлы и краткое описание:

arrayListType.h, arrayListTypeImp.cpp: объявить и реализовать класс arrayListType и его функции.

unorderedarrayListType.h unorderedArrayListTypeImp.cpp: наследовать arrayListType класс и объявлять unorderedarrayListType класс и реализовывать виртуальные функции класса arrayListType.

Ch13_Ex6.cpp: создание объекта класса unorderedArrayListType и запуск некоторых тестов.

У меня ошибка компиляции, которая, я думаю, связана с Makefile. Вот ошибка:

unorderedArrayListTypeImp.cpp:4: error: expected unqualified-id before 'using'
unorderedArrayListTypeImp.cpp: In member function 'virtual void unorderedArrayListType::insertAt(int, int)':
unorderedArrayListTypeImp.cpp:11: error: 'cout' was not declared in this scope
unorderedArrayListTypeImp.cpp:11: error: 'endl' was not declared in this scope
unorderedArrayListTypeImp.cpp:13: error: 'cout' was not declared in this scope

В строке 4 есть команда using namespace std;. Строка до этого #include "arrayListType.h". Я пробовал следующие варианты в Makefile, но ни один не работал:

Версия 1

all: Ch13_Ex6

arrayListTypeImp.o: arrayListType.h arrayListTypeImp.cpp
    g++ -c -Wall arrayListType.h arrayListTypeImp.cpp

unorderedArrayListTypeImp.o: arrayListTypeImp.o unorderedArrayListType.h unorderedArrayListTypeImp.cpp
    g++ -c -Wall arrayListTypeImp.o unorderedArrayListType.h unorderedArrayListTypeImp.cpp

Ch13_Ex6.o: Ch13_Ex6.cpp
    g++ -c -Wall Ch13_Ex6.cpp

Ch13_Ex6: arrayListTypeImp.o unorderedArrayListTypeImp.o Ch13_Ex6.o
    g++ -Wall Ch13_Ex6.o arrayListTypeImp.o unorderedArrayListTypeImp.o -o Ch13_Ex6

Версия 2:

all: Ch13_Ex6

arrayListTypeImp.o: arrayListType.h arrayListTypeImp.cpp
    g++ -c -Wall arrayListType.h arrayListTypeImp.cpp

unorderedArrayListTypeImp.o: unorderedArrayListType.h unorderedArrayListTypeImp.cpp
    g++ -c -Wall unorderedArrayListType.h unorderedArrayListTypeImp.cpp

Ch13_Ex6.o: Ch13_Ex6.cpp
    g++ -c -Wall Ch13_Ex6.cpp

Ch13_Ex6: arrayListTypeImp.o unorderedArrayListTypeImp.o Ch13_Ex6.o
    g++ -Wall Ch13_Ex6.o arrayListTypeImp.o unorderedArrayListTypeImp.o -o Ch13_Ex6

Обе версии компилируют arrayListTypeImp.o и выдают ошибку, показанную выше при компиляции unorderedArrayListTypeImp.o Ниже приводится полный вывод компиляции:

make
g++ -c -Wall unorderedArrayListType.h unorderedArrayListTypeImp.cpp 
arrayListTypeImp.o
unorderedArrayListType.h:16: error: expected unqualified-id at end of input
unorderedArrayListTypeImp.cpp:4: error: expected unqualified-id before 'using'
unorderedArrayListTypeImp.cpp: In member function 'virtual void        unorderedArrayListType::insertAt(int, int)':
unorderedArrayListTypeImp.cpp:11: error: 'cout' was not declared in this scope
unorderedArrayListTypeImp.cpp:11: error: 'endl' was not declared in this scope
unorderedArrayListTypeImp.cpp:13: error: 'cout' was not declared in this scope
unorderedArrayListTypeImp.cpp:13: error: 'endl' was not declared in this scope

Код для arrayListType.h:

#ifndef H_arrayListType
#define H_arrayListType

class arrayListType
{
public:
    bool isEmpty() const;
    bool isFull() const;        
    int listSize() const;        
    int maxListSize() const;        
    void print() const;        
    bool isItemAtEqual(int location, int item) const;

    virtual void insertAt(int location, int insertItem) = 0;        
    virtual void insertEnd(int insertItem) = 0;

    void removeAt(int location);        
    int retrieveAt(int location) const;        
    virtual void replaceAt(int location, int repItem) = 0;

    void clearList();

    virtual int seqSearch(int searchItem) const = 0;

    virtual void remove(int removeItem) = 0;

    arrayListType(int size = 100);        
    arrayListType(const arrayListType& otherList);        
    virtual ~arrayListType();

protected:
    int *list;
    int length;
    int maxSize;
};

#endif

Код для unorderArrayListTypeImp.cpp:

#include <iostream>
#include "unorderedArrayListType.h"

using namespace std;

void unorderedArrayListType::insertAt(int location, 
                                  int insertItem)
{
    if (location < 0 || location >= maxSize)
        cout << "The position of the item to be inserted "
             << "is out of range." << endl;
    else if (length >= maxSize)  //list is full
        cout << "Cannot insert in a full list" << endl;
    else
    {
        for (int i = length; i > location; i--)
            list[i] = list[i - 1];  //move the elements down

        list[location] = insertItem; //insert the item at 
                                     //the specified position

        length++;   //increment the length
    }
} //end insertAt

void unorderedArrayListType::insertEnd(int insertItem)
{
    if (length >= maxSize)  //the list is full
        cout << "Cannot insert in a full list." << endl;
    else
    {
        list[length] = insertItem; //insert the item at the end
        length++; //increment the length
    }
} //end insertEnd

// More virtual functions implemented and finally a constructor

unorderedArrayListType::unorderedArrayListType(int size)
                       : arrayListType(size)
{
}  //end constructor

Ответы [ 3 ]

3 голосов
/ 24 июня 2011

Вы не #include <iostream> в arrayListType.h, но сделали это в arrayListType.cpp, прежде чем #include "arrayListType.h" там. Вам нужно поместить #include <iostream> в arrayListType.h, прежде чем использовать std :: cout или std :: endl.

Чтобы избежать таких ошибок, хорошо бы поместить заголовок интерфейса в качестве первого оператора #include в файле реализации.

3 голосов
/ 24 июня 2011

Я предполагаю, что ошибка в unorderedArrayListType.h, вероятно, у вас пропущена точка с запятой или что-то в этом роде. Поиск в Makefile не поможет решить эту ошибку.

РЕДАКТИРОВАТЬ: Воу, на самом деле что-то не так с вашим Makefile! Хех, я только что посмотрел, и у вас есть следующее:

g++ -c -Wall arrayListType.h arrayListTypeImp.cpp

Не передавайте файлы .h в g ++ !, только файлы .cpp. Так напишите это так:

g++ -c -Wall arrayListTypeImp.cpp

Аналогично:

g++ -c -Wall unorderedArrayListType.h unorderedArrayListTypeImp.cpp

должно быть:

g++ -c -Wall unorderedArrayListTypeImp.cpp
2 голосов
/ 24 июня 2011

Эван Теран, вероятно, прав. expected unqualified-id before '...' обычно означает, что вы пропустили точку с запятой перед этой строкой. Если окажется, что это действительно ваш make-файл, вот несколько общих советов по make-файлу:

  1. Используйте переменные. Вместо

    g++ -c -Wall ...
    

    вы можете сделать

    CXX_OPTS= -Wall -O3
    ...
    g++ -c $(CXX_OPTS) ...
    
  2. Использование шаблонных правил. Вместо

    arrayListTypeImp.o: arrayListType.h arrayListTypeImp.cpp
        g++ -c -Wall arrayListType.h arrayListTypeImp.cpp
    
    unorderedArrayListTypeImp.o: unorderedArrayListType.h unorderedArrayListTypeImp.cpp
        g++ -c -Wall unorderedArrayListType.h unorderedArrayListTypeImp.cpp
    
    Ch13_Ex6.o: Ch13_Ex6.cpp
        g++ -c -Wall Ch13_Ex6.cpp
    

    вы можете использовать

    %.o:%.cpp
        g++ $(CXX_OPTS) -c $< -o $@
    

Это должно сократить ваш make-файл, упростить отладку и найти вашу проблему. Если вам нужна дополнительная информация, проверьте этот .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...