2012-09-14 285 views
2

我正在编写一个程序,其中包含使用Visual Studio 2005中的C++/CLI的辅助表单。到目前为止,由于一对重定义错误没有多大意义,所以我没有取得很大进展。重新定义;多重初始化

Mode.h(12) : error C2374: 'NameManipulator::check' : redefinition; multiple initialization 
Mode.h(12) : see declaration of 'NameManipulator::check' 
Mode.h(22) : error C2011: 'NameManipulator::Mode' : 'class' type redefinition 
Mode.h(22) : see declaration of 'NameManipulator::Mode' 

我只在一个名称空间中声明了每一个这些元素。其中一个甚至是由编译器预先生成的。除了从头开始,我还能做些什么来解决这个问题?任何帮助将非常感激。 (下面的代码)

using namespace System; 
using namespace System::ComponentModel; 
using namespace System::Collections; 
using namespace System::Windows::Forms; 
using namespace System::Data; 
using namespace System::Drawing; 

namespace NameManipulator { 
int check = 4; 
/// <summary> 
/// Summary for Mode 
/// 
/// WARNING: If you change the name of this class, you will need to change the 
///   'Resource File Name' property for the managed resource compiler tool 
///   associated with all .resx files this class depends on. Otherwise, 
///   the designers will not be able to interact properly with localized 
///   resources associated with this form. 
/// </summary> 
public ref class Mode : public System::Windows::Forms::Form 
{ 
public: 
    Mode(void) 
    { 
     InitializeComponent(); 
     // 
     //TODO: Add the constructor code here 
     // 
    } 

protected: 
    /// <summary> 
    /// Clean up any resources being used. 
    /// </summary> 
    ~Mode() 
    { 
     if (components) 
     { 
      delete components; 
     } 
    } 
public: System::Windows::Forms::RadioButton^ rdoAllCaps; 
public: System::Windows::Forms::RadioButton^ rdoAllLow; 
public: System::Windows::Forms::RadioButton^ rdoReverse; 
public: System::Windows::Forms::RadioButton^ rdoNormal; 
private: System::Windows::Forms::Button^ btnOK; 
protected: 

private: 
    /// <summary> 
    /// Required designer variable. 
    /// </summary> 
    System::ComponentModel::Container ^components; 

#pragma region Windows Form Designer generated code 
    /// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor. 
    /// </summary> 
    void InitializeComponent(void) 
    { 
     this->rdoAllCaps = (gcnew System::Windows::Forms::RadioButton()); 
     this->rdoAllLow = (gcnew System::Windows::Forms::RadioButton()); 
     this->rdoReverse = (gcnew System::Windows::Forms::RadioButton()); 
     this->rdoNormal = (gcnew System::Windows::Forms::RadioButton()); 
     this->btnOK = (gcnew System::Windows::Forms::Button()); 
     this->SuspendLayout(); 
     // 
     // rdoAllCaps 
     // 
     this->rdoAllCaps->AutoSize = true; 
     this->rdoAllCaps->Location = System::Drawing::Point(12, 12); 
     this->rdoAllCaps->Name = L"rdoAllCaps"; 
     this->rdoAllCaps->Size = System::Drawing::Size(75, 17); 
     this->rdoAllCaps->TabIndex = 0; 
     this->rdoAllCaps->Text = L"ALL CAPS"; 
     this->rdoAllCaps->UseVisualStyleBackColor = true; 
     // 
     // rdoAllLow 
     // 
     this->rdoAllLow->AutoSize = true; 
     this->rdoAllLow->Location = System::Drawing::Point(12, 35); 
     this->rdoAllLow->Name = L"rdoAllLow"; 
     this->rdoAllLow->Size = System::Drawing::Size(63, 17); 
     this->rdoAllLow->TabIndex = 1; 
     this->rdoAllLow->Text = L"all lower"; 
     this->rdoAllLow->UseVisualStyleBackColor = true; 
     this->rdoAllLow->CheckedChanged += gcnew System::EventHandler(this, &Mode::rdoAllLow_CheckedChanged); 
     // 
     // rdoReverse 
     // 
     this->rdoReverse->AutoSize = true; 
     this->rdoReverse->Location = System::Drawing::Point(12, 58); 
     this->rdoReverse->Name = L"rdoReverse"; 
     this->rdoReverse->Size = System::Drawing::Size(71, 17); 
     this->rdoReverse->TabIndex = 2; 
     this->rdoReverse->Text = L"rEVERSE"; 
     this->rdoReverse->UseVisualStyleBackColor = true; 
     this->rdoReverse->CheckedChanged += gcnew System::EventHandler(this, &Mode::rdoReverse_CheckedChanged); 
     // 
     // rdoNormal 
     // 
     this->rdoNormal->AutoSize = true; 
     this->rdoNormal->Checked = true; 
     this->rdoNormal->Location = System::Drawing::Point(12, 81); 
     this->rdoNormal->Name = L"rdoNormal"; 
     this->rdoNormal->Size = System::Drawing::Size(73, 17); 
     this->rdoNormal->TabIndex = 3; 
     this->rdoNormal->TabStop = true; 
     this->rdoNormal->Text = L"rdoNormal"; 
     this->rdoNormal->UseVisualStyleBackColor = true; 
     // 
     // btnOK 
     // 
     this->btnOK->DialogResult = System::Windows::Forms::DialogResult::OK; 
     this->btnOK->Location = System::Drawing::Point(32, 106); 
     this->btnOK->Name = L"btnOK"; 
     this->btnOK->Size = System::Drawing::Size(33, 23); 
     this->btnOK->TabIndex = 4; 
     this->btnOK->Text = L"OK"; 
     this->btnOK->UseVisualStyleBackColor = true; 
     // 
     // Mode 
     // 
     this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); 
     this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; 
     this->ClientSize = System::Drawing::Size(99, 138); 
     this->ControlBox = false; 
     this->Controls->Add(this->btnOK); 
     this->Controls->Add(this->rdoNormal); 
     this->Controls->Add(this->rdoReverse); 
     this->Controls->Add(this->rdoAllLow); 
     this->Controls->Add(this->rdoAllCaps); 
     this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedSingle; 
     this->Name = L"Mode"; 
     this->StartPosition = System::Windows::Forms::FormStartPosition::CenterParent; 
     this->Text = L"Mode"; 
     this->Load += gcnew System::EventHandler(this, &Mode::Mode_Load); 
     this->ResumeLayout(false); 
     this->PerformLayout(); 

    } 
#pragma endregion 
private: System::Void rdoReverse_CheckedChanged(System::Object^ sender, System::EventArgs^ e){ 
      if (rdoReverse->Checked == true) 
       check = 3; 
     } 
private: System::Void Mode_Load(System::Object^ sender, System::EventArgs^ e) { 
     } 
private: System::Void rdoAllLow_CheckedChanged(System::Object^ sender, System::EventArgs^ e) { 
     } 
}; 
} 
+0

你在'Mode.h'的顶部有'#pragma once'吗?看起来您在源文件中多次包含该文件。最可能的原因是你正在包含其他包含'Mode.h'的头文件。如果您没有该编译指示,那么可能会多次包含该文件,这会导致错误消息,如您所看到的那样。 – paddy

+0

另外,要小心在头文件中声明并初始化'check'。这将在包含头文件的每个源文件中创建该变量的本地副本(而不是具有跨源共享的单个变量)。这可能不是你期望的行为。相反,你可能想声明它为extern,并在'Mode.cpp'中定义它。 – paddy

+0

我在模式中包括主(其中包括模式)。哎呦。修复后,它给了我这个:'NameManipulator.obj:错误LNK2005:“int NameManipulator :: check”(?check @ NameManipulator @@ $$ Q3HA)已经在Mode.obj中定义了 – user1576628

回答

1

你的错误是你定义check变量在头文件:

namespace NameManipulator { 
    int check = 4; 
    // Error in the line above 

将其更改为一个声明,因为这样:

namespace NameManipulator { 
    extern int check; 

并将该定义添加到源文件中:

int NameManipulator::check = 4;