【问题标题】:C++: Sharing an object between two other objectsC++:在其他两个对象之间共享一个对象
【发布时间】:2019-12-17 09:18:57
【问题描述】:

有1个主类和3个类:MainMLMEMACNetwork

我希望在调用 MAC 的构造函数时在 MAC 对象中创建一个 MLME 对象。然后在调用 Network 构造函数时将同一个对象共享给 Network 对象。

这不会使 MLME 对象成为全局对象或使用 malloc()new 分配内存。

我认为这应该使用我不完全理解的参考资料来完成。 Network.cpp 中可能还必须有一些初始化列表?我在 C 方面比 C++ 更有经验,并且为了理解所有这些,我做了很多尝试。

这是我对结构、头文件和cpp文件的一些想法:

Main.cpp

#include "MAC.h"
#include "Network.h"

int main() {

    MAC mac();
    Network network(mac);

    return 0;
}

这是要分享的 MLME 部分:

MLME.h

#ifndef MLME_H_INCLUDED
#define MLME_H_INCLUDED

class MLME {
public:
    MLME();
};

#endif

MLME.cpp

#include "MLME.h"

MLME::MLME() {}

MAC 类:

MAC.h

#ifndef MAC_H_INCLUDED
#define MAC_H_INCLUDED

#include "MLME.h"

class MAC {
private:
    MLME mlme; // NULLED ?
public:
    MAC();
MLME getMLME();
};

#endif

MAC.cpp

#include "MAC.h"

MAC::MAC() {
    mlme = MLME:MLME();
}

MLME MAC::getMLME() {
    return mlme;
}

网络类:

Network.h

#ifndef NETWORK_H_INCLUDED
#define NETWORK_H_INCLUDED

#include "MLME.h"

class Network {
private:
    MLME& mlme;
public:
    Network(MAC mac);
};

#endif

Network.cpp

#include "Network.h"

class MAC;

Network::Network(MAC mac) {
    mlme = mac.getMLME();
}

【问题讨论】:

    标签: c++ object reference share initializer-list


    【解决方案1】:

    你很接近,但是:

    • Network::Network 构造函数应该引用MAC,如下所示:Network::Network(MAC& mac)。目前,您复制一份,这意味着也复制一份MLME
    • 此外,Network::Network 构造函数应该使用初始化列表来初始化mlme。所以完整的形式是:
    Network::Network(MAC& mac) : mlme(mac.getMLME()) {}
    
    • MAC::getMLME() 应该返回对MLME 的引用:MLME& MAC::getMLME()。否则,您将返回一份副本。
    • 不需要在MAC 构造函数中显式构造MLME:它已经是默认构造的。
    • 您可能希望通过说MLME(const MLME&) = delete 来防止复制MLME 实例。如果它确实是共享资源,您希望任何更改都返回到共享实例。使MLME 实例无法复制将防止您意外制作或修改副本。
    • 在您的主要功能中:MAC mac() 没有按照您的想法执行。删除() 否则会出现“最令人头疼的解析”错误。

    【讨论】:

    • 谢谢!对我来说唯一的困惑是通过说MLME(const MLME&) = delete 来防止复制MLME 实例,你能在你的答案中解释更多吗?那我就接受了。
    【解决方案2】:

    Main.cpp

    int main() {
    
        MAC mac;
        Network network(mac);
    
        mac.set(10);
    
        mac.print();
        network.print();
    
        mac.set(11);
    
        mac.print();
        network.print();
    
        return 0;
    }
    

    MLME.h

    #ifndef MLME_H_INCLUDED
    #define MLME_H_INCLUDED
    
    #include "iostream"
    using namespace std;
    
    class MLME {
    private:
        int i;
    public:
        MLME();
        void print();
        void set(int in);
    };
    
    #endif
    

    MLME.cpp

    #include "MLME.h"

    MLME::MLME() {}
    
    void MLME::print() { cout << 'i' << i << endl; }
    
    void MLME::set(int in) {
        i = in;
    }
    

    MAC.h

    #ifndef MAC_H_INCLUDED
    #define MAC_H_INCLUDED
    
    #include "MLME.h"
    
    class MAC {
    private:
        MLME mlme; // NULLED ?
    public:
        MAC();
        MLME& getMLME();
        void print();
        void set(int in);
    };
    
    #endif
    

    MAC.cpp

    #include "MAC.h"
    
    MAC::MAC() {
        mlme = MLME();
    }
    
    MLME& MAC::getMLME() {
        return mlme;
    }
    
    void MAC::print() {
        mlme.print();
    }
    
    void MAC::set(int in) {
        mlme.set(in);
    }
    

    Network.h

    #ifndef NETWORK_H_INCLUDED
    #define NETWORK_H_INCLUDED
    
    #include "MAC.h"
    
    class Network {
    private:
        MLME& mlme;
    public:
        Network(MAC& mac);
        void print();
    };
    
    #endif
    

    Network.cpp

    #include "Network.h"
    
    Network::Network(MAC& mac) : mlme(mac.getMLME()) {}
    
    void Network::print() {
        mlme.print();
    }
    

    输出

    i10
    i10
    i11
    i11
    

    【讨论】:

    • 在这个论坛中,一些描述性文字总是首选,甚至是必须的。即使我能理解你的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    相关资源
    最近更新 更多