所以我现在已经有这个问题,而且它对我的工作起到了相当大的作用。我在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
类中的函数。
提前致谢!
答案 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
。