Pregunta

Me encontré con el problema del diamante y encontré diferentes soluciones para diferentes casos con un solo diamante.Sin embargo, no pude encontrar una solución para los diamantes "encadenados".

De acuerdo con la estructura: sí, quiero tener múltiples clases base cada vez, por lo que la herencia virtual no es una solución (¿se llama incluso diamante entonces?).También quería evitar get / set-functions para cada capa intermedia de un diamante.

p   p
|   |
k   k
 \ /
  s

class parent { int val; };
class kid1 : public parent {};
class kid2 : public parent {};
class school : public kid1, public kid2 {};

Acceder a val en la clase principal funciona ahora de la siguiente manera:

school* s = new school;
s->kid1::val=1; // works

Pero, ¿qué pasa con el próximo diamante 'encadenado':

p   p   p   p
|   |   |   |
k   k   k   k
 \ /     \ /
  s       s
  |       |
  c       c
    \   /
      w

class country1 : public school {};
class country2 : public school {};
class world : public country1, public country2 {};

Accediendo a val a través de:

world* w = new world;
w->country1::kid1::val=1; // error

da como resultado:

error: ‘kid1’ is an ambiguous base of ‘world’

¿Por qué?¿No está bien definida la ruta hacia el valor?

¿Fue útil?

Solución

s->kid1::val no significa "val del subobjeto kid1".Es solo un nombre calificado por el tipo (no el subobjeto) que lo contiene.

No sé por qué se acepta country1::kid1, pero aparentemente es un typedef para ::kid1.Dos miembros de datos en world tienen el nombre calificado ::kid1::val.

Lo que quieres es:

world* w = new world;
country1* const c1 = world;
c1->kid1::val = 1;

Otros consejos

Lo es.El error se debe a un error en su compilador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top