语言: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
};
源文件: 函数()
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
);
所以就像我说的,我只需要为函数提供变量的实际名称。至少我认为。它实际做的是在对话框中的文本框和存储文本框输入的变量之间建立连接。我正在正确取消引用和所有内容,但我认为这不是正确的方法。
感谢您的帮助。对于回答我之前问题的人,我很抱歉错误地陈述了这个问题。
最佳答案
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
}
}
关于c++ - 将变量 NAME 传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6333121/