C++:在另外两个对象之间共享一个对象
C++: Sharing an object between two other objects
有 1 个主要 class 和 3 个 classes: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 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 引用 MLME
:MLME& 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
有 1 个主要 class 和 3 个 classes: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 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 引用MLME
:MLME& 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