C++ 来自表单单元和非表单单元的函数返回值

C++ 来自表单单元和非表单单元的函数返回值,c++,c++builder,C++,C++builder,以前我能够得到这个结果,但后来我进一步扩展了对其工作原理的理解 单元1.h #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <System.Classes.hpp> #include <Vcl.Controls.hpp> #include <Vcl.StdCtrls.hpp>

以前我能够得到这个结果,但后来我进一步扩展了对其工作原理的理解

单元1.h

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
TButton *Button1;
TButton *Button2;
TLabel *Label1;
TLabel *Label2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
单元3.cpp

//---------------------------------------------------------------------------

#pragma hdrstop

#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)

int FindArea(int l, int w)
{
    return l * w;
}
我得到了这样的错误

[bcc32 Error] Unit1.cpp(31): E2268 Call to undefined function 'getLength'


当我将这些新函数的声明和定义与“FindArea”函数进行比较时,我无法理解这一点。

您正在从
Unit1.cpp
中调用
getLength()
getWidth()

在这种情况下,这两个函数是不可见的(“它们位于”
Unit2.cpp
。请看一看)

您有两个选择:

  • extern int getLength();
    extern int getWidth();
    
    Unit1.cpp
    文件的开头。代码< >外部> /COD>关键字指示外部链接(即函数的定义可以预期来自其他C++文件)。编译器会相信您已经在某个地方实现了该函数。如果链接器找不到它,则会出现链接器错误

  • Unit2.h
    中声明这两个函数,并在
    Unit1.cpp
    中包含此头文件(有关详细信息:)

但是

您应该注意,您的
getLength()
函数不是
TForm2::getLength()
成员函数的实现

要定义
TForm2::getLength()
,您必须编写:

int TForm2::getLength()
{
  return 15;
}
(您还应该在
Unit1.cpp
中包含
Unit2.h

调用
TForm2::getLength()
的语法是:

Form2->getLength()

通常,不访问私有/受保护数据成员的成员函数没有多大意义(您应该更喜欢a)。

您正在从
Unit1.cpp
内调用
getLength()
getWidth()

在这种情况下,这两个函数是不可见的(“它们位于”
Unit2.cpp
。请看一看)

您有两个选择:

  • extern int getLength();
    extern int getWidth();
    
    Unit1.cpp
    文件的开头。代码< >外部> /COD>关键字指示外部链接(即函数的定义可以预期来自其他C++文件)。编译器会相信您已经在某个地方实现了该函数。如果链接器找不到它,则会出现链接器错误

  • Unit2.h
    中声明这两个函数,并在
    Unit1.cpp
    中包含此头文件(有关详细信息:)

但是

您应该注意,您的
getLength()
函数不是
TForm2::getLength()
成员函数的实现

要定义
TForm2::getLength()
,您必须编写:

int TForm2::getLength()
{
  return 15;
}
(您还应该在
Unit1.cpp
中包含
Unit2.h

调用
TForm2::getLength()
的语法是:

Form2->getLength()

通常,不访问私有/受保护数据成员的成员函数没有多大意义(您应该更喜欢a)。

我不清楚这个问题,错误消息也很清楚。你真的应该更好地解释你想做什么,什么在起作用,你期望看到什么,你改变了什么,然后你要看到什么,你实际看到了什么。当我编译错误时,错误弹出,就像你看到上面提到的错误一样。我改变/增加的是,我在Unit2中创建了函数,以便从Unit1调用它们。对于进一步的细节,错误显示“[bcc32 Error]Unit1.cpp(31):E2268调用未定义函数“getWidth”完整解析器上下文Unit1.cpp(28):解析:void\u fastcall TForm1::Button1Click(TObject*)[bcc32 Error]Unit1.cpp(32):E2268调用未定义函数“getLength”完整解析器上下文Unit1.cpp(28):parsing:void _fastcalltform1::Button1Click(TObject*)”。刚刚意识到我遗漏了一些导致混淆的代码。我道歉了。我刚刚更新了它。这个问题对我来说很不清楚,错误信息也很清楚。你真的应该更好地解释你想做什么,什么在起作用,你期望看到什么,你改变了什么,然后你要看到什么,你实际看到了什么。当我编译错误时,错误弹出,就像你看到上面提到的错误一样。我改变/增加的是,我在Unit2中创建了函数,以便从Unit1调用它们。对于进一步的细节,错误显示“[bcc32 Error]Unit1.cpp(31):E2268调用未定义函数“getWidth”完整解析器上下文Unit1.cpp(28):解析:void\u fastcall TForm1::Button1Click(TObject*)[bcc32 Error]Unit1.cpp(32):E2268调用未定义函数“getLength”完整解析器上下文Unit1.cpp(28):parsing:void _fastcalltform1::Button1Click(TObject*)”。刚刚意识到我遗漏了一些导致混淆的代码。我道歉了。我刚刚更新了它。很有趣。。。我不知道还有更多的新东西要学。似乎形式单位和非形式单位的编码方法都有所不同。。。你的第一个选择不是真正的选择。是的,它可以编译,但这不是一个好主意,因为它使您很容易犯错误并引入未定义的行为,而不进行诊断(例如,如果您错误地编写了
extern double getWidth();
)。组织自由函数的正确方法是,一个头应该有函数声明;任何需要调用该函数的代码都应该包含该头。@MattMcNabb它对于快速修复/测试可能很有用,但当然正确、干燥的组织是基于include文件的(链接的答案也可以推断出这一点)。无论如何,我认为列出这两个“选项”很重要,因为这两个选项都有助于理解基本概念。。。我不知道还有更多的新东西要学。似乎形式单位和非形式单位的编码方法都有所不同。。。你的第一个选择不是真正的选择。是的,它是编译的,但这是一个坏主意,因为它使您很容易犯错误并引入未定义的行为,而没有诊断
int TForm2::getLength()
{
  return 15;
}
Form2->getLength()