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();