0

我正在尝试使用 Visual C++ 编写一个简单的 Windows 窗体应用程序

我的问题是我在 .cpp 上构建了一个函数

Form1.cpp

bool function()
{
    //code
}

问题是我试图从.h文件调用这个函数来点击按钮

表格1.h

private: 
System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    bool result = function();
}

我有编译错误。

我在上一篇文章中读到“尝试onClick在 .cpp 文件中声明你的主体”。问题是......我不确定我应该在 .cpp 文件中究竟放什么?

感谢您的时间; 非常感谢任何帮助。

4

2 回答 2

2

您可以在使用之前简单地放置函数的原型。

bool function();
void whatever::button_click()
{
    bool result = function();
}

如果您不希望它在函数之外可见,您甚至可以将原型放入函数中:

void whatever::button_click()
{
    bool function();
    bool result = function();
}

当然,如果 .cpp 文件中的函数与原型不匹配,则会出现链接器错误。

于 2013-03-19T20:53:53.350 回答
0

我认为这里的问题是你不明白为什么一切都是 c++ 世界中的样子。假设您想创建一个具有函数 Bar 的 Foo 类,您只需执行此操作非常简单

class Foo
{
    void Bar(){/*code*/}
};

现在你在一个文件中有 Foo 类,但你还需要一个必须在另一个文件中的 Baz 类。你不能移动 Foo,所以 C++ 有#include 系统。这样,您可以将 Foo 放在一个文件中,将 Baz 放在另一个文件中,并且仍然可以同时使用它们。一个理论上的例子可能是:

#include "Foo.h"
class Baz
{
     Foo* foo;
};

编译器会这样翻译(现在考虑 Foo.h 包含我之前写的内容):

class Foo
{
    void Bar(){/*code*/}
}; 

class Baz
{
     Foo* foo;
};

但是由于多种原因,这是非常低效的,首先,如果我们保留这样的所有内容,那么每次您在其他地方#included 文件时,编译器都必须编译相同的内容,因此 C++ 有另一种机制可以让您告诉类 Foo 存在于其他地方的编译器,它将在未来可用,它看起来有点像这样,所以当你在 C++ 中创建一个类时,你使用 .h 文件来描述它的外观并将实现保留在 cpp文件。在这种情况下,它看起来像这样:

//Foo.h

class Foo
{
    void Bar();
}; 

//Foo.cpp
#include "Foo.h"
void Foo::Bar(){/*code*/}

//Baz
#include "Foo.h"
class Foo
{
    void Bar(){/*code*/}
};

所以 TLDR,您需要做的是删除函数定义,将其保留为

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e);

并且在cpp文件中有

System::Void Form1::button1_Click(System::Object^  sender, System::EventArgs^  e) 
{
    bool result = function();
}
于 2013-03-19T21:16:36.167 回答