如何在c ++中从另一个类'方法访问类'方法

时间:2014-05-18 01:52:14

标签: c++ class

所以我现在已经有这个问题,而且它对我的工作起到了相当大的作用。我在C ++方面没有专业,但我现在已经使用了一段时间了。

main.cpp中:

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string>
#include <cstdlib> // makes random way better by using time as a seed
#include <ctime>   // makes random way better by using time as a seed
//#include "Reference.h"
#include "Ref.cpp"
using namespace std;

///--Declarations--\\\

Assets assets;
TextPlay textplay;
///----------------\\\

int main() {
    assets.editConsoleState(true);

    ///----Console---\\\

    while (assets.consoleState() == true)) {
        textplay.consoleRefresh();
        textplay.makeCommand();
    }
    ///--------------\\\

    return 0;
}

Ref.cpp:

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string>
#include <cstdlib> // makes random way better by using time as a seed
#include <ctime>   // makes random way better by using time as a seed
using namespace std;

class Assets
{
public:
    void editConsoleState(bool newstate)
    {
        isConsole = newstate;
    }

    bool consoleState()
    {
        bool state;
        state = isConsole;
        return state;
    }
private:
    bool isConsole;
};

class TextPlay
{
public:
    void consoleRefresh()
    {
        cout << " -Input Command-" << endl;
        cout << "" << endl;
        cout << "> ";
    }

    void consoleIntro()
    {
        cout << "Welcome to the console!" << endl;
        cout << "" << endl;
        consoleRefresh();

    }

    void makeCommand()
    {
        cin >> command;

        if (command == "exit")
        {

            // assets.editConsoleState(false); how would i do this
        }
        else
        {
            cout << "" << endl;
            cout << " INVALID COMMAND" << endl;
            cout << "" << endl;
        }
    }
private:
    string command;
};

所以基本上我想通过放在控制台中的exit命令取消while循环,但是我不知道如何调用Assets类中的函数。

提前致谢!

2 个答案:

答案 0 :(得分:1)

您的class TextPlay可以作为成员变量引用Assets对象(请参阅下面的代码):

class TextPlay {
  public:
    TextPlay(Assets &_assets) : assets(_assets) {}
    ...
  private:
    Assets &assets;
    string command;
};

然后您的主要功能将变为:

Assets assets;
TextPlay textplay(assets);

int main() {
  assets.editConsoleState(true);
  while (assets.consoleState() == true)) {
    textplay.consoleRefresh();
    textplay.makeCommand();
  }

  return 0;
}

答案 1 :(得分:0)

首先,您的代码布局是错误的。你不应该这样做:

#include "Ref.cpp"

绝不要包含另一个.cpp个文件。

类定义应位于头文件(例如Ref.h)中,该文件包含在需要查看它们的任何.cpp文件中。

现在,您无法“在Assets类中调用函数”(除非它是静态函数)。 就像创建对象的蓝图。 Assets的成员函数只能在Assets类型的对象上调用。您实际要做的是在assets对象(类型为Assets)上调用函数。

目前您有一个全局变量assets。我猜你想要调用这个对象的函数。如果是这样,那么你可以写:

extern Assets assets;    // says that "assets" is the name of an Assets object defined elsewhere
assets.editConsoleState(false);

这样可行,但这是一个糟糕的设计。但是当你开始使用C ++时,很难想出好的类设计。您需要一些编码经验才能理解为什么糟糕的设计不好,以及优秀的设计有什么好处。所以现在不要太担心它。

让你的类定义只包含方法声明会有所改进;并在.cpp个文件中包含方法体。您还可以将extern Assets assets;放入定义Assets的标头文件中;然后编译器将能够强制assets实际上是Assets