在.h内的Invoque .cpp方法

时间:2013-03-19 20:50:00

标签: c++ visual-c++ onclick

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

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

Form1.cpp

bool function()
{
    //code
}

问题是我试图从.h文件中调用此函数做到单击按钮

Form1.h

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

我正在编译错误。

我在上一个帖子中读到“尝试在.cpp文件中声明onClick的正文”。 问题是......我不确定我究竟应该在.cpp文件中添加什么内容?

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:0)

我认为这里的问题是你不明白为什么一切都和c ++世界一样。 假设您想制作一个具有功能栏的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();
}