Winforms C++;带参数的构造函数赢得';t初始化,错误C2059和C2228 我是一个C程序员,试图通过C++来创建一个Windows窗体应用程序。 我有一个Windows窗体,它使用用户创建的类。基本上,我试图使用一个接受参数的构造函数,但是我的表单不允许我用参数初始化对象。这是代码,希望有人能向我解释这个问题,因为我完全困惑了
这是我的头文件:BankAcct.hWinforms C++;带参数的构造函数赢得';t初始化,错误C2059和C2228 我是一个C程序员,试图通过C++来创建一个Windows窗体应用程序。 我有一个Windows窗体,它使用用户创建的类。基本上,我试图使用一个接受参数的构造函数,但是我的表单不允许我用参数初始化对象。这是代码,希望有人能向我解释这个问题,因为我完全困惑了,winforms,parameters,constructor,c++-cli,Winforms,Parameters,Constructor,C++ Cli,这是我的头文件:BankAcct.h public ref class BankAcct { private: int money; public: BankAcct(); BankAcct(int); void Deposit(int); void GetBalance(int&); }; 和我的定义文件:BankAcct.cpp #include "StdAfx.h" #include
public ref class BankAcct
{
private:
int money;
public:
BankAcct();
BankAcct(int);
void Deposit(int);
void GetBalance(int&);
};
和我的定义文件:BankAcct.cpp
#include "StdAfx.h"
#include "BankAcct.h"
BankAcct::BankAcct()
{
money = 0;
}
BankAcct::BankAcct(int startAmt)
{
money = startAmt;
}
void BankAcct::Deposit(int depAmt)
{
money += depAmt;
}
void BankAcct::GetBalance(int& balance)
{
balance = money;
}
最后是我的主要形式。当然,我不会复制整个内容,但我正在尝试声明新的银行帐户对象,并以余额(比如50美元)开始
private:
BankAcct myAccount(50); //does not work! WHY??
//private:
//BankAcct myAccount; //works
那么在表单构造函数中,我的代码是:
public:
frmBank(void)
{
InitializeComponent();
int bal;
myAccount.GetBalance(bal);
lblBankBalance->Text += Convert::ToString(bal);
}
我已经在frmBank.h的顶部包含了bankact.h文件,我还做错了什么?如果我使用默认构造函数(银行余额为零的构造函数),效果会很好。我收到以下错误消息:
错误C2059:语法错误:“常量”
及
错误C2228:“.GetBalance”的左侧必须具有类/结构/联合
谢谢你在这件事上的帮助 < P> C风格初始化在C++中不起作用。您需要在构造函数的初始化部分(即:
和构造函数的开头括号{
之间)放置初始值设定项:
public:
MyForm() : myAccount(50) {
// Your constructor
}
private:
BankAcct myAccount;
您现在的方式,<代码> MyCube 不定义为<代码> BANKACT/<代码>,所以调用< GETBACKION/CODE> >也不编译。
< P> C·风格初始化在C++中不起作用。您需要在构造函数的初始化部分中设置初始化器(即在<代码>:< /Cord>)和“打开括号<代码> >之间。{的构造函数:public:
MyForm() : myAccount(50) {
// Your constructor
}
private:
BankAcct myAccount;
按照现在的方式,myAccount
没有定义为BankAcct
,因此GetBalance
调用也不会编译。一个简单的解决方法:
private:
BankAcct *myAccount; // Make this a pointer
……然后
frmBank(void)
{
InitializeComponent();
myAccount = new BankAcct(50);
int bal = myAccount->GetBalance(bal);
lblBankBalance->Text += Convert::ToString(bal);
还有其他方法。但我认为显式创建“myAccount”对象可以说是最清晰、最简单的方法。IMHO…一个简单的解决方法:
private:
BankAcct *myAccount; // Make this a pointer
……然后
frmBank(void)
{
InitializeComponent();
myAccount = new BankAcct(50);
int bal = myAccount->GetBalance(bal);
lblBankBalance->Text += Convert::ToString(bal);
还有其他方法,但我认为明确创建“我的帐户”如果C++ C++ C++语言的对象是C++/CLI,那么C++是一个最简单、最简单的例子。如果你不知道差异:在Visual Studio 2010中,C++,CLI是正确的吗?不是C++吗?如果你不知道区别:是的,C++ + CLI。在Visual Studio 2010中。尝试了它,它起作用了,但是我从未见过这种初始化技术。以前。你知道任何教程、说明等的链接吗?或者甚至建议一些谷歌搜索的关键词吗?另外,作为后续问题:如果我想以相同的形式初始化2个(或更多)银行帐户怎么办?@SomeGirl查看第10.6节。查找“初始化列表”更多信息。如果需要初始化多个成员变量,请用逗号分隔它们:
acct1(123)、acct2(456)
。您需要按照在类中声明它们的相同顺序放置它们。@dasblinkenlight:实际上,您不需要按照声明的相同顺序放置它们,编译器会像对待您一样对待它们。忽略它们在ctor初始值设定项列表中出现的顺序,忽略它们,初始化按声明顺序进行。@BenVoigt Th我决定简化解释,但你肯定是对的。我尝试过,但我以前从未见过这种初始化技术。你知道任何教程、解释等的链接吗?或者甚至建议谷歌搜索的一些关键词吗?另外,作为后续问题:如果我想初始化,怎么办ze 2个(或更多)相同形式的银行账户?@SomeGirl查看第10.6节。有关更多信息,请查阅“初始化列表”。如果需要初始化多个成员变量,请用逗号分隔它们:acct1(123)、acct2(456)
。您需要按照在类中声明它们的相同顺序放置它们。@dasblinkenlight:实际上,您不需要按照声明的相同顺序放置它们,编译器会像对待您一样对待它们。忽略它们在ctor初始值设定项列表中出现的顺序,忽略它们,初始化按声明顺序进行。@BenVoigt Th我决定简化解释,但你肯定是对的。这对我不起作用,它说了以下错误:C3699:“*”不能在类型“BankAcct”C2750上使用此间接寻址:“BankAcct”:不能在引用类型上使用“new”;使用“gcnew”代替C2440:“=”:无法从“BankAcct*”转换为“BankAcct^”还有以前的其他错误。啊-那是因为你显然在使用微软的.Net方言C++:是的,我正在使用Visual Studio 2010。那么我还能使用这种变通方法吗?或者类似的技术吗?@Paul一直在试验,如果我使用BankAcct^myAccount,然后,myAccount=gcnew BankAccount(50)它就可以工作了。谢谢你的帮助!这对我不起作用,它说了以下错误:C3699:“*”不能在类型“BankAcct”C2750上使用此间接寻址:“BankAcct”:不能在引用类型上使用“new”;使用“gcnew”代替C2440:“=”:不能从“BankAcct*”转换为“BankAcct^”,以及以前的其他错误。啊-那是因为你是appa直接使用Microsoft的.Net C++方言:是的,我使用的是Visual Studio 2010。那么我还可以使用这种变通方法吗?或者类似的技术吗?@Paul一直在尝试,如果我使用BankAcct^myAccount,然后使用myAccount=gcnew BankAccount(50),它就可以工作了。谢谢你的帮助!