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

问题描述 投票:0回答:2

有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
2个回答
0
投票

您已经关闭,但是:

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

0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.