有1个主要类别和3个类别:Main
,MLME
,MAC
和Network
。
我希望在调用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();
}
您已经关闭,但是:
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
实例。如果它确实是共享资源,则您希望所有更改都返回到共享实例。使其无法复制MLME
实例将防止您意外创建或修改副本。MAC mac()
并未执行您认为的操作。删除()
,否则会出现“最令人烦恼的解析”错误。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