Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 再次初始化变量_C++_Oop_Class - Fatal编程技术网

C++ 再次初始化变量

C++ 再次初始化变量,c++,oop,class,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

这听起来可能有点混乱。基本上,我有一个函数

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;
}
所有带有
m
的变量都是成员变量。但是,构造函数在我正常初始化卡时工作

CCard卡()

在节目开始时。然而,我也有一个功能,应该创建一张新卡并将其返回给用户,这个功能现在被破坏了

原始命令:
card=newCard()不再可用,并且
card=new CCard()不起作用。我还有其他选择吗?我觉得使用构造函数是行不通的,我可能应该创建一个类方法newCard,但我想看看是否有可能按照老师想要的方式来做


这让我很头疼。我告诉老师这是一个愚蠢的想法,并不是所有的东西都必须用面向对象的方法来分类。他后来告诉我Java或C不允许类外的代码,这听起来有点不可思议。不确定你可以在C++中这样做,尤其是在模板函数存在的时候,或者泛型算法。如果我不强制它进入一个类,这是不是真的是面向C++的OOP代码? 编辑:

我要感谢大家的帮助性回答!然而,我相信我对这个问题的措辞有点错误,我认为人们不理解我在寻找什么

我不想初始化CCard类型的另一个成员。我想初始化

CCard-card
一次,然后通过构造函数给出
card
新值,因为这是老师让我做的。我不想创建一个新的CCard对象,只需再次使用具有新值的同一变量即可

这就是为什么我说它可能不会与构造函数一起工作。所以我有一个函数,它应该取初始化的变量
card
,然后再次调用构造函数(“What?”是我告诉老师的),然后给它新的值

示例代码:

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

这才是真正的问题。对不起,如果我混淆了所有的XD

< P>我也是C++的新手,但是我认为你可能需要一个复制构造函数来从函数返回对象:

CCard::CCard (const CCard &rhs)
    : m_Gehiemzahl(rhs.m_Geheimzahl) // and so on for each member variable
{
}

不要忘记将原型添加到类声明中。

只是一些基本的指针,因为您有一些误解

这不会初始化
CCard
,对象。它将
card
声明为返回
CCard
且不带参数的函数

CCard card();
如果您想构造一个
CCard
对象,那么只需这样做

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

表达式
new CCard()
动态创建
CCard
对象,并“返回”指向
CCard
对象的指针,然后需要
删除该对象。在您成功创建并了解如何首先使用本地对象之前,我不建议您使用它

根据问题编辑进行编辑

构造函数在对象的生命周期中只能调用一次,因此您永远不能“重新构造”对象。但是,如果您的类是可分配的,则通常可以将默认构造的临时值分配给它:

card = CCard();
是使用默认构造函数的方法

<>但是你的老师是错误的,在C++中,我们将使用自由函数来很好地扩展函数。 在您的情况下,使用构造函数是明智的,因为它的意思是这样的,除非您有特殊需要,您不需要进行新卡:这将生成不必要的副本


“new”是为指针保留的,因此您必须使用如下内容:

 CCard * card = new CCard();
你必须明确地
删除它们。但指针应该只在必要时使用,如果可能的话,不要使用“原始”指针,而是使用智能指针。(请参阅boost::shared\u ptr等智能指针)


供您编辑

您可以使用以下方法为您的CCard提供新值:

-)一种类似CCard的方法:

card.newValues();
构造函数还可以调用“newValues()”以避免冗余

-)以CCard作为参考参数的自由函数(或另一类的成员):

 void newValues( CCard & card ) { /* set new values */ };

 newValues( card );
-)直接地

如果它对您的类有意义的话,可以使用一组访问器(set/get)

您必须问自己的问题是,您是想用访问器更改类内部,还是只想更改类内部的值

-)如果确实要再次调用构造函数,可以复制:

 CCard c;
 c = CCard();

但这就像创建一个新的CCard。

你的老师试图说明的一点是,你不需要新的对象。相反,您需要提供一种与当前拥有的对象进行交互/操作的方法。您不需要重建对象,只需更改对象的内部状态即可


当然,在“函数式语言原则”中,可变状态被认为是bug的主要来源。但可变状态本身并不坏;简单地说,改变对象的内部状态并不总是显而易见的。你想让它变得明显。

“并不是所有的东西都必须用面向对象编程来分类。他后来告诉我Java或C不允许在课堂外编写代码,这听起来有点不可思议。”你完全正确,你的老师是个白痴。C++不是OOP语言,OOP不是唯一的编程范例。事实上,现代C++设计要求你更喜欢自由函数而不是成员函数!您的老师可能认为您应该将其移动到构造函数中是正确的,但原因是错误的。不要为了成为OOP而让事情OOP,如果有意义就让它们OOP,如果没有意义就不要。也就是说,这一切都取决于你在做什么,我很难弄清楚。如果一张卡有一个默认状态,那就是默认构造函数的作用。否则它就不属于合同
 void newValues( CCard & card ) { /* set new values */ };

 newValues( card );
 card.set( /*values*/ );
 CCard c;
 c = CCard();