Comme je peux le comprendre, en C++, faire memcpy avec l'objet de classe nécessitera un constructeur de copie personnalisé défini pour rendre les opérations comme memcpy valide. Ai-je tort? Il n'y a pas de méthode de classe virtuelle impliqués ainsi, comme ci-dessous:en C++, instance instance instance memcpy plante toujours
class A {
public:
string name;
int32_t score;
A(const string &n, const int32_t score): name(n), score(score) {}
A() {};
~A() {};
// define custom copy constructor;
A(const A &a) {
name = a.name;
score = a.score + 90;
}
A& operator=(const A &a) {
name = a.name;
score = a.score + 90;
return *this;
}
};
int main() {
cout << "test is running..." << endl;
string name = "thisIsAName";
A a(name, 66);
A *a1 = new A();
// send to another process
produce(&a);
// receive from the other process
auto *res = consume();
// cast to A
if(res->size == sizeof(A)) {
memcpy((uint64_t *)a1, (const uint64_t *)res->data, res->size;
} else {
// Do log error and return
return 1;
}
std::cout << a1->name << "|" << a1->score << std::endl;
std::cout << a.name << "|" << a.score << std::endl;
cout << "test reached end" << endl;
return 0;
}
Y at-il une erreur que je fait?
Également si possible s'il vous plaît donner une meilleure compréhension de memcpy en C++ avec l'objet de classe. Merci beaucoup.
++ Merci les gars, je viens de tester à nouveau semble que j'ai mal compris à propos de memcpy et copier constructeur. La raison d'utiliser memcpy pour lancer en classe A après avoir reçu un objet d'un autre processus. Alors, quelle est la meilleure façon de coder dans cette situation? BR. Stefan
Pourquoi ne pas définir un constructeur de copie pour ne pas utiliser 'memcpy'? Vous ne savez pas non plus pourquoi vous lancez un 'A *' sur un 'uint64_t *' – EdChum
C'est tout faux! Vous initialisez 'a' pour pointer vers un * littéral de chaîne * (pas un objet' A' réel). Vous écrasez les données sans tenir compte du constructeur de copie ou de l'affectation de copie. –
Votre code est incomplet et les pièces que vous avez postées sont erronées. S'il vous plaît poster un code réel. –