【问题标题】:Defining a label (in a header) from a .cpp file从 .cpp 文件定义标签(在标题中)
【发布时间】:2017-12-09 19:35:06
【问题描述】:

我在尝试在头文件之外定义标签时遇到了一点问题。三天前我才开始尝试学习 C++,所以我可能在这里犯了一个我没有注意到的非常明显的错误。到目前为止,我还没有设法让它发挥作用。

我想在 MIDCSrc.cpp 中定义文本,而标签的声明在 MIDC.h 中。到目前为止,我在 MIDC.h 中所做的是:

*MIDC.h*
#include "MIDCSrc.cpp"

*VS Auto-generated code*

private: System::Windows::Forms::Label^  label1;

*VS Auto-generated code*

private: System::Void label1_Click(System::Object^  sender, System::EventArgs^  e)
{
    textfunc2(label1);
}

在 MIDCSrc.cpp 中是:

#include "MIDC.h"

namespace MIDC
{
    void textfunc2(System::Windows::Forms::Label^ aLabel)
    {
    aLabel->Text = "Wow!";
    }
}

(我正在使用 Visual Studio 2017 社区)

问题是,我什至无法测试它是否会失败,因为它给了我一个 "Error C2084 function 'void MIDC::textfunc2(System::Windows::Forms::Label ^) '已经有一个主体"

正如我所说,如果这是一个明显的错误,我很抱歉,但我想不出这个可爱的错误。如果除了正文错误之外的代码有什么问题(我知道有),如果可能的话,告诉我。必须解决这个问题。

感谢回复的人:-)

【问题讨论】:

  • 我不是 c++/CLI 专家,但 #including 头文件中的 cpp 文件通常会导致灾难。这正常吗?
  • .h 包括 .cpp,其中包括不好的 .h。正如弗兰克所说,除非您完全确定自己在做什么,否则不要在标题中包含 .cpp 文件。
  • 特别是没有某种标题保护。无限包含递归。
  • 哼.. 没想到。现在,我怎样才能让程序识别 textfunc2,它在 .cpp 上,在 .h 上,以便它可以使用它? (不包括 .cpp)
  • 听起来你需要回归基础。像这样的程序一开始可能有点太多了。

标签: c++ visual-c++ c++-cli visual-studio-community


【解决方案1】:

试试 user4581301 提到的建议:“标题保护”。这可以防止递归包含文件。这很容易:

#ifndef _MIDC_H
#define _MIDC_H

// here go the contents of MIDC.h

#endif

在您的 CPP 文件中执行相同的操作:

#ifndef _MIDCSRC_CPP
#define _MIDCSRC_CPP

// here goe the contents of MIDCSrc.cpp

#endif

#define'd 符号的选择是任意的。我在这里选择的名称只是常见的做法。诀窍是仅当未定义此符号时才包含文件的内容 - 这是默认情况。 #ifndef 主体的第一步是#define 它,所以#ifndef 条件只满足一次。

【讨论】:

    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多