C++构造函数的不可解释行为

yvfmudvl  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(119)

我想创建这些类:一个 * 机器人 * 类,一个 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;
        }

然后在输出中有两条“机器人已创建”消息。

hc2pp10m

hc2pp10m1#

似乎只创建了一个robot示例
不,不是这样的。创建了两个示例。第二个示例是复制构造的,而您没有记录它。

Robot(){ //default constructor

这只是默认的构造函数,现在,添加一个Robot(const Robot &),在这里,记录它,并观看您的第二个机器人使其宏伟的入口。

LLC1( Robot & Robj): r(Robj)

这将复制构造r。您没有定义复制构造函数,因此会创建一个默认构造函数。

相关问题