Я играю с некоторыми примерами C++.
Я пытаюсь предоставить двум классам доступ к одной и той же очереди. Это код:
#include <iostream>
#include <queue>
using namespace std;
class MessageQueue{
public:
std::queue<int> m_queue;
};
class A_Object{
public:
MessageQueue *ToMQ=0;
};
class B_Object{
public:
MessageQueue *FromMQ=0;
};
void connectMQ(MessageQueue *original, MessageQueue *source, MessageQueue *destination);
void connectMQ(MessageQueue *original, MessageQueue *source, MessageQueue *destination){
source = original;
destination = original;
// source and destination has the same addresses as original
}
int main() {
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
MessageQueue *messageQueue1Send;
messageQueue1Send = new MessageQueue();
A_Object a_Object;
B_Object b_Object;
connectMQ(messageQueue1Send, a_Object.ToMQ, b_Object.FromMQ);
// at this point the addresses of a_Object.ToMQ and b_Object.FromMQ dont show to the same adress on the heap like messageQueue1Send
messageQueue1Send->m_queue.push(10);
int value = b_Object.FromMQ->m_queue.front();
cout << "value = "<< value << endl;
return 0;
}
После метода connectMQ
адреса уже не те. Похоже, что присваивания connectMQ
допустимы только внутри тела метода.
Как правильно выполнить назначения, чтобы устранить эту ошибку и получить доступ только к адресу кучи, а не к стеку?
Старайтесь избегать использования указателей в C++, когда вместо этого вы можете использовать ссылки. Используйте nullptr
вместо C-измов, таких как ptr* x = 0
.
В этом коде
void connectMQ(MessageQueue *original, MessageQueue *source, MessageQueue *destination){
source = original;
destination = original;
// source and destination has the same addresses as original
}
у вас есть копии входных аргументов. Изменение источника ничего не делает с переменными вызывающей стороны. Если вы хотите изменить source
и destintation
, сделайте это
void connectMQ(MessageQueue *original, MessageQueue **source, MessageQueue **destination){
*source = original;
*destination = original;
// source and destination has the same addresses as original
}
называется так
connectMQ(messageQueue1Send, &a_Object.ToMQ, &b_Object.FromMQ);
source = original;
иdestination = original;
не делайте того, что вы думаете. Знаете ли вы, что в С++ параметры функции передаются по значению, и знаете ли вы, что означает «передача по значению»?