2014-01-10 62 views
0

我有一個Windows窗體項目。我不想將表單頭文件中的所有函數和回調以及所有自動生成的代碼都放在一起,而是將它們放在單獨的C++文件中。Visual C++ CLR表單項目。使用單獨的C++文件的功能

我發現這篇文章回答了這個問題,但我無法得到它的工作。我必須失去了一些東西:How to use a separate .cpp file for my event function definitions in windows forms?

在我的單獨C++文件我已經試過如下:

#include "stdafx.h" 
#include "DeltaForm.h" 

namespace DeltaControl 
{ 
    // Search for all serial ports and add them to the port combobox 
    void searchPorts(void) 
    { 
     array<Object^>^ portsArray = SerialPort::GetPortNames(); 
     this->cbPort->Items->AddRange(portsArray); 
    } 

} 

這給輸出:

1>test.cpp(10): error C2355: 'this' : can only be referenced inside non-static member functions 
    1>test.cpp(10): error C2227: left of '->cbPort' must point to class/struct/union/generic type 
    1>test.cpp(10): error C2227: left of '->Items' must point to class/struct/union/generic type 
    1>test.cpp(10): error C2227: left of '->AddRange' must point to class/struct/union/generic type 

而且這樣的:

#include "stdafx.h" 
#include "DeltaForm.h" 

namespace DeltaControl 
{ 
    // Search for all serial ports and add them to the port combobox 
    void DeltaForm::searchPorts(void) 
    { 
     array<Object^>^ portsArray = SerialPort::GetPortNames(); 
     this->cbPort->Items->AddRange(portsArray); 
    } 

} 

輸出:

1>test.cpp(7): error C2039: 'searchPorts' : is not a member of 'DeltaControl::DeltaForm' 
1>   f:\documents\cloud\projects\deltarobot\deltarobotcontrol_vcpp\deltacontrol\deltacontrol\DeltaForm.h(16) : see declaration of 'DeltaControl::DeltaForm' 
1>test.cpp(10): error C2355: 'this' : can only be referenced inside non-static member functions 
1>test.cpp(10): error C2227: left of '->cbPort' must point to class/struct/union/generic type 
1>test.cpp(10): error C2227: left of '->Items' must point to class/struct/union/generic type 
1>test.cpp(10): error C2227: left of '->AddRange' must point to class/struct/union/generic type 

這裏是我的表單頭文件:http://pastebin.com/gGfMiwVr 它基本上只是生成的代碼。

我覺得我在這裏錯過了一些非常重要的東西,但我的C++技能還不算太好。

當我把上面第一個例子中的searchPorts函數放到表單頭文件中時,它沒有問題。

編輯:

我剛剛解決了我自己的問題!我不得不在DeltaForm類中聲明該函數:

private: void searchPorts(void); 

由於單獨的C++文件沒有定義類中的函數。是否有可能拆分多個C++文件的類,所以我不需要首先聲明該函數?或者,是否可以從課堂外引用表單對象?

回答

1

您的問題可能與CLR無關。

在您的第一個代碼中,您將顯示一個免費函數。一個自由函數不屬於一個類(它不是你的DeltaForm的成員函數),因此不能訪問「this」指針。它與一個類的實例或一個類沒有關聯。

在你的第二個代碼中,你可能更接近你想要的,但你很可能不會在類中聲明searchPorts成員函數。

您需要的聲明添加到類的頭:

class DetalForm 
{ 
    /* ... */ 
    void DeltaForm::searchPorts(void); 
    */ ... */ 
}; 

不要忘了分號。

類標題中的聲明不會有正文。實體就是你的(第二個)代碼片段。

+0

感謝:D傻我我應該知道要先申報。有沒有辦法將這個類擴展到多個文件?只需在頭文件中聲明它就足夠簡單了,所以我無法想象在這種情況下我會嘗試在多個文件中擴展一個類。但我不介意知道學習的興趣。 – Chris

+0

@Chris:#Includes在預處理器級別處理,所以理論上你可以通過#including不同部分將類聲明拆分爲多個文件。不過,我從來沒有見過。可能不是一個好主意。 – Duther