2011-06-13 97 views
0

语言:的Visual C++,MFC传递变量名的功能

环境: Visual Studio 2005中

所以我张贴了类似的问题,但我认识到,我是问错误的问题。我试图用一个循环来调用几个不同变量的函数,但是在这个过程中的某个地方,程序崩溃了。

简化的代码在下面,但我认为它实际上更容易解释它。我有一个函数将CString作为参数。我有几个变量我希望提供给这个函数,所以我把他们的名字放到一个数组中,我试图通过这种方式将它们传递给函数。

//下面的代码是什么,我也有,但它不工作//

头文件:

CString m_strTop; 
CString m_strLeft; 
CString m_strRight; 
CString m_strBottom; 

CString *var[4]; 

源文件: 构造函数( )

CString *var[4] = { 
    &m_strTop 
, &m_strLeft 
, &m_strRight 
, &m_strBottom 
}; 

源文件: theFunction()

void myClass::DoDataExchange(CDataExchange* pDX) 
{ 
    CSAPrefsSubDlg::DoDataExchange(pDX); 

    for(int i = 2001, j = 0; i <= 2004; i++, j++) 
    { 
     // THE LINE BELOW IS WHERE THINGS GO WONKY, SPECIFICALLY AT &var[j] 
     DDX_Text(pDX, i, *var[j]); // 'i' is the ID of the textbox 
    } 
} 

- DDX_TEXT期待什么 -

void AFXAPI DDX_Text(
    CDataExchange* pDX, 
    int nIDC, 
    CString& value 
); 

所以就像我说的,我只需要给函数提供变量的实际名称。至少我想。实际上做的是在对话框中的文本框和文本框的输入将被存储的变量之间建立连接。我正确地解除引用和一切,但我不认为这是正确的方法。

谢谢你的帮助。对于回答我上一个问题的人,我很抱歉歪曲了这个问题。

回答

3

var是指向CString的指针数组。
var[j]是指向CString的指针。
&var[j]是指向CString的指针的指针。

现在您需要通过CString对象。因此,你需要:

DDX_Text(pDX, i, *var[j]); // dereference a pointer to CString. 

考虑使用std::vector而不是C数组。这将是:

std::vector<CString> var(4); 
... 

DDX_Text(pDX, i, var[j]); // pass a CString object 

我注意到,你在构造函数中声明变量再次var

CString *var[4] = { // this declares new temporary variable, 
        // it doesn't initialize one from the header file 
    &m_strTop 
, &m_strLeft 
, &m_strRight 
, &m_strBottom 
}; 

不应该是什么? :

var[0] = &m_strTop; 
var[1] = &m_strLeft; 
var[2] = &m_strRight; 
var[3] = &m_strBottom; 

我想你需要以下条件:

// header file 
class myClass 
{ 
    std::vector<CString> var_; 
    ... 
}; 

// source file 
myClass::myClass() : var_(4) 
{ 
    ... 
} 

void myClass::theFunction(CDataExchange* pDX) 
{ 
    CSAPrefsSubDlg::DoDataExchange(pDX); 

    for(int i = 2001, j = 0; i <= 2004; i++, j++) 
    { 
     DDX_Text(pDX, i, var_[j]); // 'i' is the ID of the textbox 
    } 
} 
+0

拍摄,复制和粘贴错误的东西。我把它正确地作为* var [j],但它仍然无法正常工作。这不是存储在我感兴趣的变量中的信息,而是变量的实际名称。我是否需要创建一个变量名称的CString数组? – Jon 2011-06-13 16:21:47

+0

什么是DDX_Text寻找?如果它正在寻找对CString的引用,那么否,否则,你需要使var为CString [] = {“m_strTop”,“m_strLeft”,...};自从我使用DDX_Text已经很久了,我不记得它是什么,因为它是第三个参数 – miked 2011-06-13 16:23:51

+0

什么是“变量名称”?在你的情况下,'DDX_Text'根据'CDataExchange :: m_bSaveAndValidate'的值将控件的值(编辑框或类似的东西)复制到'CString'中,反之亦然。 – 2011-06-13 16:26:11

1

你没有通过正确的事情到DDX_TEXT。它的第三个参数是对CString的引用。你正在传递一个指针的地址。所以你应该做点像

DDX_Test(pDX, i, *var[j]); 
+0

拍摄,复制和粘贴错误的东西。我把它正确地作为* var [j],但它仍然不正确。 – Jon 2011-06-13 16:20:40