C++:在另外两个对象之间共享一个对象

C++: Sharing an object between two other objects

有 1 个主要 class 和 3 个 classes: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 class:

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;
}

网络class:

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

你很接近,但是:

  • Network::Network 构造函数应该引用 MAC,像这样:Network::Network(MAC& mac)。当前您复制一份,这意味着还要复制 MLME
  • 此外,Network::Network构造函数应该使用初始化列表来初始化mlme。所以完整的形式是:
Network::Network(MAC& mac) : mlme(mac.getMLME()) {}
  • MAC::getMLME() 应该 return 引用 MLMEMLME& MAC::getMLME()。不然你return一份。
  • 不需要 MAC 构造函数中 MLME 的显式构造:它已经是默认构造的。
  • 您可能想通过说 MLME(const MLME&) = delete 来防止复制 MLME 个实例。如果它真的是一个共享资源,您希望任何更改都返回到共享实例。使其无法复制 MLME 个实例将防止您意外制作或修改副本。
  • 在您的主要功能中:MAC mac() 并没有按照您的想法行事。删除 () 否则会出现 "most vexing parse" 错误。

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