[英]Passing variable NAME to a function
语言:视觉C++、MFC
环境: Visual Studio 2005
所以我发布了一个类似的问题,但我意识到我问错了问题。 我正在尝试使用循环在几个不同的变量上调用 function,但在此过程中,程序崩溃了。
简化的代码如下,但我认为解释它实际上更容易。 我有一个 function 接受 CString 作为参数。 我有几个变量希望提供给这个 function,所以我将它们的名称放入一个数组中,然后我试图以这种方式将它们传递给 function。
// 下面的代码是我所拥有的,但它不起作用 //
Header 文件:
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
);
所以就像我说的,我只需要给 function 提供变量的实际名称。 至少我认为。 它实际上所做的是在对话框中的文本框和将存储文本框输入的变量之间建立连接。 我正确地取消了引用,但我认为这不是正确的方法。
感谢您的任何帮助。 对于回答我之前问题的人,我为歪曲这个问题而道歉。
var
是指向CString
的指针数组。
var[j]
是指向CString
的指针。
&var[j]
是指向CString
的指针。
现在您需要传递CString
object。 所以你需要:
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
}
}
您没有将正确的内容传递给 DDX_Text。 它的第三个参数是对 CString 的引用。 您正在传递指针的地址。 所以你可能应该做类似的事情
DDX_Test(pDX, i, *var[j]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.