【问题标题】:Accessing an object from another class C++ [duplicate]从另一个类 C++ 访问对象 [重复]
【发布时间】:2015-03-20 20:36:03
【问题描述】:

我正在尝试创建一个图书馆系统。我有一个名为 3.cpp 的源文件,有几个名为 Game.h、DVD.h、Book.h、Library.h 和 Media.h 的类。

我正在 3.cpp 中创建一个名为 lib 的对象,并且我正在尝试从 Game 类访问 lib 对象。我怎样才能做到这一点?我在 Mac 操作系统上使用 Eclipse。

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

当我尝试访问在 Game 类中创建的 lib 对象时,我也遇到了一些错误。我得到的错误是:

1. Use of undefined identifier lib.
2. Method insertGame could not be resolved.
3. Method deleteGame could not be resolved.

【问题讨论】:

  • 这里的代码太多,请用最小的例子(少于 10 或 20 行代码)隔离您的问题。这里的类和文件太多,很难弄清楚你的问题是什么......
  • 您好,我已经编辑了帖子。

标签: c++ eclipse oop object compiler-errors


【解决方案1】:

问题:

您已将Library lib; 定义为main() 的局部变量。这意味着您可以在 main() 中访问此变量,但不能在其他任何地方访问。

不幸的是,您在属于Game 类的成员函数GameMenu() 中引用了lib。 `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 
    ...
}

现在考虑一下代码的整体结构:目前,3.cpp 中有一个菜单,Game 中有一个菜单。这是Library 中的逻辑,因为这些菜单功能实际上是关于管理库对象。 Game 的意义不大,但由您选择。

最后,如果您正在学习 c++,我强烈建议您摆脱 c[] 字符串、strcpy()strcmp() 等,并选择 c++ string

【讨论】:

  • 我为什么要创建另一个 .cpp 文件。我是否对 DVD、书籍等所有内容都执行此操作??
  • 如何将游戏、dvd 和书籍的菜单放入图书馆??
  • 因为将成员函数的实现放在 cpp 中是一个很好的做法,并且只在标题中定义类。另一个原因是您的类定义不依赖于完整的库定义,而成员的定义则依赖。因此,如果您将所有内容都保存在一个标头中,则需要包含 eLibrary,该 eLibrary 需要包含您的标头,该标头需要...。您将有一个循环依赖,这将阻止编译。
猜你喜欢
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多