Winforms C++;带参数的构造函数赢得';t初始化,错误C2059和C2228 我是一个C程序员,试图通过C++来创建一个Windows窗体应用程序。 我有一个Windows窗体,它使用用户创建的类。基本上,我试图使用一个接受参数的构造函数,但是我的表单不允许我用参数初始化对象。这是代码,希望有人能向我解释这个问题,因为我完全困惑了

Winforms 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

这是我的头文件: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 "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),它就可以工作了。谢谢你的帮助!