再次初始化变量

IAE*_*IAE 4 c++ oop class

这可能听起来有点令人困惑.基本上,我有一个功能

CCard newCard() 
{
    /* Used to store the string variables intermittantly */
    std::stringstream ssPIN, ssBN;
    int picker1, picker2;
    int pin, bankNum;

    /* Choose 5 random variables, store them in stream */
    for( int loop = 0; loop < 5; ++loop )
    {
        picker1 = rand() % 8 + 1;
        picker2 = rand() % 8 + 1;
        ssPIN << picker1;
        ssBN  << picker2;
    }
    /* Convert them */
    ssPIN >> pin;
    ssBN  >> bankNum;

    CCard card( pin, bankNum );
    return card;
}
Run Code Online (Sandbox Code Playgroud)

创建一个新的CCard变量并将其返回给调用者

CCard card = newCard();

我的老师告诉我,这样做违反了OOP原则,必须放在课堂上.他让我用这个方法作为构造函数.我做了什么:

CCard::CCard()
{
    m_Sperre   = false;
    m_Guthaben = rand() % 1000;

    /* Work */

    /* Convert them */
    ssPIN >> m_Geheimzahl;
    ssBN  >> m_Nummer;
}   
Run Code Online (Sandbox Code Playgroud)

所有变量m_都是成员变量.但是,当我正常初始化卡时,构造函数工作

CCard card();

在计划开始时.但是,我也有一个功能,应该创建一个新卡并将其返回给用户,此功能现在已被破坏.

原始命令: card = newCard();不再可用,并且card = new CCard();不起作用.我还有其他选择吗?我有一种感觉,使用构造函数将无法正常工作,我可能应该只创建一个类方法newCard,但我想看看它是否以某种方式按照老师的意愿去做.

这给我带来了很多麻烦.我告诉老师,这是一个愚蠢的想法,并不是所有东西都必须归入OOP.从那时起他就告诉我Java或C#不允许在类之外的代码,这听起来有点不可思议.不确定您是否可以在C++中执行此操作,尤其是在存在模板化函数或通用算法时.如果我没有强制它进入类中,这对于C++中的OOP来说是不是很糟糕?

编辑:

我要感谢大家的有益答案!但是,我相信我对这个问题的措辞有些搞砸,我认为人们不明白我在寻找什么.

希望初始化类型C卡的另一名成员.我想要初始化

CCard card一次,然后card通过构造函数给出新的值,因为这是老师告诉我要做的.我不想创建一个新的CCard对象,只需再次使用相同的变量和新值.

这就是为什么我说它可能不适用于构造函数.所以我有一个函数应该采用初始化变量card,然后再次调用构造函数("什么?"是我告诉老师的),然后给它新的值.

示例代码:

void foo()
{
    /* Initialize card with constructor */
    CCard card;
    /* Give it new values through the constructor AGAIN... */
    card;
}
Run Code Online (Sandbox Code Playgroud)

这是实际问题.如果我把每个人都弄糊涂了,我很抱歉

CB *_*ley 7

只是一些基本的指示,因为你有一些误解.

这不是初始化CCard对象.它声明card是一个返回a CCard并且不带参数的函数.

CCard card();
Run Code Online (Sandbox Code Playgroud)

如果你想构建一个CCard对象,那么就这样做.

CCard card;
Run Code Online (Sandbox Code Playgroud)

您的构造函数将被调用,card应该正确初始化.

表达式new CCard()动态创建一个CCard对象,并"返回" 指向CCard您需要的对象的指针delete.在您首先成功创建并理解使用本地对象之前,我不建议使用此方法.

编辑以回答问题编辑

构造函数只能在对象的生命周期中调用一次,因此您无法"重新构造"对象.但是,如果您的类是可分配的,则通常可以为其分配默认构造临时值:

card = CCard();
Run Code Online (Sandbox Code Playgroud)