Question

J'ai une définition de classe semblable à ce qui suit:

class UUID
{
  public:
    // Using implicit copy assignment operator

  private:
    unsigned char buffer[16];
};

Je viens d'avoir un test unitaire échouer sur moi qui a été vérifié que l'affectation de copie a fonctionné correctement. À ma grande surprise, un octet au milieu du tableau tampon [] a été copié correctement.

Ma compréhension est que l'opérateur d'affectation copie par défaut effectue copie membre à membre, et que pour les membres du groupe (non membres pointeur-à-array) dans laquelle sont une copie du tableau par éléments. Je me trompe?

Mon sentiment est ici gut que j'ai été mordu par un endroit de pointeur ballants qui a piétiné au milieu de mon tableau. Mais, je vois ce répétable quand, par exemple Je copie un vecteur de ces objets dans un autre vecteur.

Quelqu'un voudra-t me dire où je suis allé mal?

Modifier

Pour développer cela un peu, la classe n'est pas un type POD - il dérive de quelques classes de base abstraite et a donc une destructor virtuelle. Cependant, le tableau est le seul membre de données, et l'utilisation qui a éclaté dans le test unitaire était le suivant:

const int n = 100;

std::vector<UUID> src, dst;
src.reserve(n);
dst.resize(n);

for (int i = 0; i < n; ++i) {
  UUID id;
  src.push_back(id);
}

for (int i = 0; i < n; ++i) {
  dst[i] = src[i];
}

bool good = true;
for (int i = 0; i < n; ++i) {
  const bool thisGood = (dst[i] == src[i]);

  std::cout << "i = " << i << " -> src = '" << src[i]
            << "', dst = '" << dst[i] << "', src == dst ? "
            << thisGood << '\n';

  good = (good && thisGood);
}
Était-ce utile?

La solution

  

Ma compréhension est que l'opérateur d'affectation de copie par défaut effectue copie membre à membre, et que pour les membres du groupe (non membres pointeur-à-array) qui copie de occasionnés par éléments du tableau.

Oui. Cela est correct.

Votre problème est pas avec l'opérateur d'affectation de copie (sauf si vous avez trouvé un bug du compilateur inhabituel, ce qui est peu probable).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top