C ++:在其他两个对象之间共享一个对象

有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();
}
baorry 回答:C ++:在其他两个对象之间共享一个对象

您已经关闭,但是:

  • struct A { A() { throw "bahh"; } }; void operator delete(void* ptr) noexcept { std::cout << "normal delete" << std::endl; free(ptr); } void operator delete(void* ptr,const std::nothrow_t&) noexcept { std::cout << "nothrow delete" << std::endl; free(ptr); } int main() { std::cout << "calling new A" << std::endl; try { new A(); // prints: normal delete } catch(const char* s) { std::cout << s << std::endl; // bahh } std::cout << "calling new(std::nothrow) A" << std::endl; try { new(std::nothrow) A(); // prints: nothrow delete } catch(const char* s) { std::cout << s << std::endl; // bahh } } 构造函数应通过引用使用jest.fn().mockImplementation(() => Promise.resolve(value)); ,例如:<SITE SITE.NAME="NewSite" SITE.ID="1094096085" bindings="*" state="Started"> <site name="NewSite" id="1094096085" serverAutoStart="false"> 。目前,您正在制作副本,这意味着也要制作Network::Network的副本。
  • 此外,MAC构造函数应使用初始化列表来初始化Network::Network(MAC& mac)。因此,完整的格式为:
MLME
  • Network::Network应该返回对mlme的引用:Network::Network(MAC& mac) : mlme(mac.getMLME()) {} 。否则,您将返回一份副本。
  • 不需要MAC::getMLME()构造函数中的MLME的显式构造:它已经是默认构造的。
  • 您可能想通过说MLME& MAC::getMLME()来防止复制MLME实例。如果它确实是共享资源,则您希望所有更改都返回到共享实例。使无法复制MAC实例将防止您意外地制作或修改副本。
  • 在您的主要功能中:MLME并没有您认为的那样。删除MLME(const MLME&) = delete,否则会出现“最令人烦恼的解析”错误。
,

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
本文链接:https://www.f2er.com/2907825.html

大家都在问