C ++ массив в заголовочном файле - PullRequest
1 голос
/ 30 апреля 2011

Я выполняю упражнение и у меня возникают проблемы с его началом. Я должен написать программу для структуры данных массива. Имеется тестовый комплект, и мне нужно реализовать код для структуры данных. Я не уверен, как определить массив в заголовочном файле

ниже приведен тестовый файл main.cpp, который я не могу редактировать

#include <fstream>
#include <iostream>
using namespace std;


// *****************************
// you need to create this class
// *****************************
#include "ArrayIntStorage.h"


int main(int argc, char **argv) {
// ***********************************
// non-sort read & then sort using std
// ***********************************
ifstream fin1("ACW2_data.txt");
ofstream out1("1-arrayUnsortedRead.txt");
//ofstream out2("2-arrayUnsortedRead-thenSTDSort.txt");

if(!fin1.is_open()) 
{
    cout << "FAIL" << endl;
    return 1;
}

ArrayIntStorage arrayStorage1;
arrayStorage1.setReadSort(false);   // do not read sort

// read in int values into data structure
fin1 >> arrayStorage1;

// output int values in data structure to file
out1 << arrayStorage1;

// sort data structure using std
arrayStorage1.sortStd();

// output int values in data structure to file
out2 << arrayStorage1;

fin1.close();
out1.close();
out2.close();

любая информация о заголовочных файлах и о том, как использовать их с этим основным файлом, будет высоко ценится

Merci Beaucoup

Ответы [ 3 ]

2 голосов
/ 30 апреля 2011

Я почти уверен, что ВЫ должны создать заголовок ArrayIntStorage.h И реализовать соответствующий ArrayIntStorage.cpp.

На основе комментария "// sort data using std" вы должны будете использовать и создать оболочку для соответствующего контейнера stl, что-то вроде std :: vector.

Исходя из комментария "// не читать сортировку", вы должны по умолчанию сортировать вектор после каждой вставки (если, конечно, кто-то не вызовет setReadSort (false) для вашей оболочки).

В дополнение к интерфейсу, описанному выше, вам все еще нужно реализовать >> и <<. </p>

UPDATE.

Читая ваш вопрос на C ++ переменная передачи из .cpp в файл заголовка вы, кажется, совсем смущены всем этим ...

Первым делом добавим поддержку операторов >> и <<: </p>

Вы делаете это, объявляя эти операторы в своем .h файле:

friend std::ostream& operator<<(std::ostream &out, const ArrayIntStorage &a);

friend std::ifstream & operator>>(std::ifstream &, ArrayIntStorage &);

Затем вы определяете их реализацию в файле .cpp:

std::ostream& operator<<(std::ostream &out, const ArrayIntStorage &a)
{ return out; }

std::ifstream & operator>>(std::ifstream &, ArrayIntStorage &)
{ return in; }

Очевидно, вам нужно добавить туда какой-то правильный код, это просто для его компиляции. Если он по-прежнему не компилируется, проверьте, включили ли вы заголовки потока в ваш файл .h:

#include <fstream>
#include <iostream>

Теперь для общей информации:

Ваше хранилище массивов должно основываться на чем-то вроде std :: vector. Назначение функций >> и <<, которые вам нужно реализовать, состоит в том, чтобы добавлять и извлекать int из этого контейнера. </p>

Поскольку ArrayIntStorage является классом, после того, как вы установили необходимый интерфейс (общедоступные функции-члены в файле .h), вам нужно только взглянуть на .h и .cpp, чтобы конкретизировать реализацию.

Как только это будет сделано, вам не понадобится какое-либо "внешнее" безумие, когда ответили на ваш другой вопрос. Посмотрите на свою основную функцию. If создает объект вашего класса и поток fin1. Затем он вызывает оператор >>, который вы реализовали. Все это делается с помощью локальных переменных.

Вот как вы «используете значение этой переменной из main.cpp». Вы вызываете функцию-член вашего класса с этой переменной в качестве параметра.

И, наконец, если у вас есть все эти проблемы с пониманием заголовочных файлов и ошибок ссылок, вы уверены, что начали с правильного упражнения?

2 голосов
/ 30 апреля 2011

Файл заголовка ArrayIntStorage должен выглядеть следующим образом: -

Сигнатура функции может меняться в зависимости от использования: -

// ArrayIntStorage.h - header file

class ArrayIntStorage
{

   public :

    ArrayIntStorage();  // this is the constructor
                        // You may skip this constructor, and use the default one 

    void setReadSort(bool bSort);
    void sortStd()

  // Add any public members if needed

   private :

    // Add any private members/ functions if needed

}
1 голос
/ 30 апреля 2011

Марк,

http://www.cplusplus.com/doc/tutorial/ (о котором я упоминал в своем комментарии) подвел нас. Они не обсуждают заголовочные файлы как отдельную тему ... однако http://www.learncpp.com/cpp-tutorial/19-header-files/ делает.

Обычно заголовочный файл определяет «интерфейс» вашего класса. Он помещен в отдельный файл, чтобы пользователи вашего класса могли просто включить это «определение интерфейса» в свой код ... Например, #include "ArrayIntStorage.h". Это позволяет компилятору определить, не ошиблись ли они, например, неправильно написанное имя метода, или передать параметр неправильного типа ... знаете, все те ошибки компилятора, которые вы видели ... да?

Таким образом, вы определяете ЧТО делает ваш класс в файле .h ... а затем в файле .cpp вы определяете КАК он это делает.

Имеет ли это смысл?

Приветствия. Кит.

...