我想创建这些类:一个 * 机器人 * 类,一个 HLC(高级控制器)类和多个 LLCHLC控制器将在LLC之间切换。机器人具有以下状态(位置,速度等)的真实的机器人。所有的控制器(HLC,LLC)具有机器人作为属性,因为它们需要机器人状态。所以我希望机器人对象的同一个示例在所有的LLC和HLC对象中。
过了一段时间,我让它工作了。然而,在“调试”期间,我不能理解一些行为,这就是为什么我问这个问题:
下面是有问题的代码(带有注解和文本。我还提到了让它工作所需的条件)。我将提出代码之后出现的问题。
#include <iostream>
class Robot{
public:
Robot(){ //default constructor
std::cout<< "a robot is created \n";
val = rand();
}
int val;
};
定义LLC 1类,正确的方法是使用Robot & r
,以便所有类都有相同的robot示例。但是,我将使用初始有问题的代码Robot r
,因为问题是关于我在调试过程中无法解释的输出。
class LLC1{
private:
Robot r;
public:
LLC1( Robot & Robj): r(Robj) {
// r = Robj; //if not commented out, then 3 robots would be created
std::cout<< r.val << " in LLCconstructor" <<std::endl;
}
int getVal(){ return r.val; }
void add1(){ r.val ++; }
};
class HLC{
private:
Robot r;
LLC1 lc1;
public:
//General member functions:
void printVal(){
std::cout<< r.val <<std::endl;
std::cout<< lc1.getVal() <<std::endl;
}
void control(){ lc1.add1(); }
//constructors will be presented in detail
};
int main() {
HLC hl;
hl.printVal();
hl.control();
hl.printVal();
return 0;
}
我想创建两个构造函数。
第一个构造函数:
HLC(): lc1(this->r) {
std::cout<< r.val << " in HLCconstructor" << std::endl;
};
使用此构造函数执行程序,但是,输出不是所需的:
a robot is created
1804289383 in LLCconstructor
1804289383 in HLCconstructor
1804289383
1804289383
1804289383
1804289384
问题1:
看起来只创建了一个robot示例,而且HLC和LLC 1都是同一个示例,但是我用LLC 1的 * add 1 * 函数添加一个,HLC的robot的值没有变化,所以肯定是不一样的,这怎么可能?
第二个构造函数:
HLC() {
r = Robot();
lc1 = LLC1(r);
};
使用这个构造函数编译会失败。我的理论是,首先使用默认构造函数创建lc 1(由于LLC 1没有默认构造函数,因此它会失败),然后我们尝试使用复制构造函数为其赋值。
**问题2:**在类构造函数中,如果一个属性在方括号(“{}”)之前没有初始化,那么调用默认构造函数创建示例,然后如果我们给它赋了特定的值,那么使用复制构造函数?
以下事实证明了这一点:
1.因为第二个构造函数编译失败。
1.因为如果LLC 1的构造函数被这样修改:
LLC1( Robot & Robj) {
r = Robj; //if not commented out, then 3 robots would be created
std::cout<< r.val << " in LLCconstructor" <<std::endl;
}
然后在输出中有两条“机器人已创建”消息。
1条答案
按热度按时间hc2pp10m1#
似乎只创建了一个robot示例
不,不是这样的。创建了两个示例。第二个示例是复制构造的,而您没有记录它。
这只是默认的构造函数,现在,添加一个
Robot(const Robot &)
,在这里,记录它,并观看您的第二个机器人使其宏伟的入口。这将复制构造
r
。您没有定义复制构造函数,因此会创建一个默认构造函数。