2015-03-20 2 views
-2

Я пытаюсь создать библиотечную систему. У меня есть исходный файл под названием 3.cpp, несколько классов под названием Game.h, DVD.h, Book.h, Library.h и Media.h.Доступ к объекту из другого класса C++

Я создаю объект под названием lib в 3.cpp, и я пытаюсь получить доступ к объекту lib из класса Game. Как я могу это сделать? Я использую Eclipse onMac os.

Источник 3.cpp файл:

#include <stdlib.h> 
#include <iostream> 
#include <fstream> 
#include <string> 
#include "Library.h" // include header of Library class 
#include "Game.h" // include header of Game class 
#include "DVD.h" // include header of DVD class 
#include "Book.h" // include header of Book class 
using namespace std; 

int main(){ 

    Library lib; 

    while(1){ 

     char mainSelect; 
     char gameOption, name[30], platform[30], copies[10]; 
     char dvdOption, director[30]; 
     char bookOption, author[30]; 
     char mainMenu; 

     // Read user selection 
     cin.getline(name, 80); 
     mainSelect = name[0]; 

     // Switch statement to select between the options 
     switch (mainSelect){ 
      case '1': 
       break; 
      case '2': 
       break; 
      case '3': 
       break; 
      case '4': 
       exit(0); 
       break; 
      case '5': 
       cout << "Invalid selection!" << endl; 
       system("pause"); 
       break; 
     } 

     if (mainSelect == '1'){ 

      cin.getline(name, 80); 
      dvdOption = name[0]; 

     switch (dvdOption){ 

      case '1': 
       cout << "Enter Name of DVD: "; 
       cin.getline(name, 80); 
       cout << "Enter Director of DVD: "; 
       cin.getline(director, 80); 
       cout << "Enter no of copies: "; 
       cin.getline(copies, 80); 
       lib.insertDVD(name, director, atoi(copies)); 
       break; 
      case '2': 
       cout << "Enter Name of DVD:\n"; 
       cin.getline(name, 80); 
       lib.deleteDVD(name); 
       break; 
      case '3': 
       cout << "Enter Name of DVD:\n"; 
       cin.getline(name, 80); 
       DVD *item; 
       item = lib.searchDVD(name); 
       if(item != NULL){ 
       cout << "DVD found\n" << item->name << endl << item->director << endl << item->copies << endl; 
       } 
       else 
       cout << "DVD not found\n"; 
       break; 
      case '4': 
       break; 
      case '5': 
       exit(0); 
       break; 
      case '6': 
       cout << "Invalid selection!" << endl; 
       system("pause"); 
       break; 
     } 
     } 

     else if (mainSelect == '2'){ 
      "I need to add a method here to call the GameMenu method from the Game class." 


    return 0; 
} 

Код класса Игра:

#ifndef GAME_H_ 
#define GAME_H_ 

#include "Media.h" 
#include "Library.h" 
using namespace std; 

class Game : public Media{ 
public: 

    char platform[45]; 
    char gameOption, name[30], platform[30], copies[10]; 

    void GameMenu(){ 
cout << "****************************************************" << endl; 
      cout << "******************* Game Menu ********************" << endl; 
      cout << "****************************************************" << endl; 
      cout << "*             *" << endl; 
      cout << "* PROGRAM   DESCRIPTION      *" << endl; 
      cout << "* ------------------------------------------------ *" << endl; 
      cout << "*             *" << endl; 
      cout << "* 1    Add a new Game     *" << endl; 
      cout << "*             *" << endl; 
      cout << "* 2    Delete a Game     *" << endl; 
      cout << "*             *" << endl; 
      cout << "* 3    Search for a Game    *" << endl; 
      cout << "*             *" << endl; 
      cout << "* 4    Return to the previous Menu  *" << endl; 
      cout << "*             *" << endl; 
      cout << "* 5    EXIT       *" << endl; 
      cout << "*             *" << endl; 
      cout << "* ------------------------------------------------ *" << endl; 
      cout << "*             *" << endl; 
      cout << "****************************************************" << endl; 

      cin.getline(name, 80); 
      gameOption = name[0]; 

     switch (gameOption){ 

      case '1': 
      cout << "Enter Name of Game: "; 
      cin.getline(name, 80); 
      cout << "Enter game platform: "; 
      cin.getline(platform, 80); 
      cout << "Enter no of copies: "; 
      cin.getline(copies, 80); 
      lib.insertGame(name, platform, atoi(copies)); 
      break; 
      case '2': 
      cout << "Enter Name of Game:\n"; 
      cin.getline(name, 80); 
      lib.deleteGame(name); 
      break; 
      case '3': 
      cout << "Enter Name of Game:\n"; 
      cin.getline(name, 80); 
      Game *item; 
      item = lib.searchGame(name); 
      if(item != NULL){ 
      cout << "Game found\n" << item->name << endl << item->platform << endl << item->copies << endl; 
      } 
      else 
      cout << "Game not found\n"; 
      break; 
      case '4': 
      exit(0); 
      break; 
      case '5': 
      cout << "Invalid selection!" << endl; 
      system("pause"); 
      break; 
     } 
    } 

}; 


#endif // end of "#ifndef" block 

Я также получаю некоторые ошибки, когда я пытаюсь получить доступ к библиотеке объект, созданный в игре класс. Ошибки я получаю:

+1

Там слишком много кода здесь, пожалуйста, изолировать проблему минимальный пример (менее 10 или 20 строк кода). Здесь слишком много классов и файлов, и сложно понять, в чем проблема ... – jpo38

+0

Привет, я редактировал сообщение. – user3472448

ответ

2

Проблемы:

Вы определили Library lib; в качестве локальной переменной main(). Это означает, что вы можете получить доступ к этой переменной в main(), но нигде больше.

К сожалению, вы ссылаетесь на lib на функцию-член GameMenu(), принадлежащую классу Game. `GameMenu() не видит локальные переменные вызывающих функций.

Я стараюсь сделать это просто: функция GameMenu() живет в черном ящике своего класса. Он может использовать свои собственные локальные переменные, такие как item, а также члены класса, такие как gameOption. Но не переменные мира не выходят из черного ящика.

Другие ошибки - это только последствия первого. Например, в вашем заявлении lib.insertGame(name, platform, atoi(copies));, поскольку компилятор не знает, что такое lib, он жалуется, потому что он не знает, что он может сделать с объектом, которого он не знает.

Существует еще одна проблема с collection[numGames].copies, которую вы определили как c-строку в классе, но попробуйте управлять как int.

У вас также есть структурная проблема. Это не ошибка, но это плохая привычка.
Если вы поместите класс в заголовок, вы должны поместить только его объявления (элементы данных и объявления функций), а не определения функций.

Решение

Сначала упростить Game.h заголовок следующим образом:

#ifndef GAME_H_ 
#define GAME_H_ 

#include "Media.h" 
using namespace std; 

class Library; // forward declaration, will dbe detailed later 
class Game : public Media{ // no code 
public: 
    char platform[45]; 
    char gameOption, name[30]; 
    int copies; // change to numeric 

    void GameMenu(Library& lib); // pass an argument called lib by reference 
}; 
#endif // end of "#ifndef" block 

Затем поместите код в новый Game.cpp файл:

#include "Game.h" 
#include <iostream> 
using namespace std; 

#include "Library.h" 

void Game::GameMenu(Library& lib) // now he knows lib. 
{ 
    ... // put your code here 
    cin>>copies; // instead of getline() 
    lib.insertGame(name, platform, copies); // no atoi() anymore, its already an int 
    ... 
} 

Теперь подумайте о целом структура вашего кода: на данный момент t вот меню в 3.cpp и меню в Game. Это логика в Library, потому что эти функции меню действительно касаются управления библиотечным объектом. Это делает меньше смысла в Game, но до вас на выбор.

Наконец, если вы изучаете C++, я настоятельно советую вам избавиться от ваших c[] строк, strcpy(), strcmp() и так, и выбрать C++ string

+0

Почему я создаю другой .cpp-файл. И я делаю это для всего, как DVD, книги? – user3472448

+0

Как я могу поместить меню в игру, dvd и книги в библиотеку? – user3472448

+0

Потому что это хорошая практика, чтобы поместить реализацию функций-членов в cpp и определение класса только в заголовке. Другая причина заключается в том, что определение вашего класса не зависит от полного определения библиотеки, в то время как определение участника делает это. Следовательно, если вы сохранили все в одном заголовке, вам нужно будет включить eLibrary, в который должен быть включен ваш заголовок, который нуждается ... У вас будет циклическая зависимость, которая предотвратит компиляцию. – Christophe

Смежные вопросы