En el ciclo for a continuación:

struct Block
{
    Block(int d) : data(d), next(nullptr) {}

    int data;
    Block* next;
};

Block* aList = new Block(1);
Block* bList = new Block(2);

for (Block* a = aList, *b = bList; a != nullptr; a = a->next, b = b->next)
    if (aList->data != bList->data)
        cout << "Difference found.\n";

No me gusta poner el * antes de b, pero, por supuesto, es necesario distinguir Bloque de Bloque *. Hay otra manera de hacer esto? for ((Block*) a, b... no es una opción.

c++
0
Topological Sort 9 may. 2019 a las 17:09

6 respuestas

La mejor respuesta

Si no desea repetir *, puede usar using y crear un alias BlockPtr que use en lugar de Block*:

int main() {
  using BlockPtr = Block*;

  BlockPtr aList = new Block(1);
  BlockPtr bList = new Block(2);

  for (BlockPtr a = aList, b = bList; a != nullptr; a = a->next, b = b->next)
    if (aList->data != bList->data)
      cout << "Difference found.\n";
}

O retransmitir en auto:

int main() {

  auto aList = new Block(1);
  auto bList = new Block(2);

  for (auto a = aList, b = bList; a != nullptr; a = a->next, b = b->next)
    if (aList->data != bList->data)
      cout << "Difference found.\n";
}
2
t.niese 9 may. 2019 a las 14:24

Al declarar punteros, el * pertenece al nombre, no al tipo. Eso significa que puede convertir b en un puntero como

for (Block *a = aList, *b = bList; a != nullptr; a = a->next, b = b->next)
1
NathanOliver 9 may. 2019 a las 14:11

Estás intentando declarar dos punteros en una expresión.

Block* a = aList, b = bList;

Resulta que es parte de un bucle for, pero igual

int * a, * b;

Son dos int punteros, puedes usar

Block* a = aList, * b = bList;

En tu for bucle.

1
doctorlove 9 may. 2019 a las 14:13

Sí, solo usa:

Block* a = aList, *b = bList

Editar:

Opción 1: uso de Boost

#include <boost/typeof/typeof.hpp>
/*
    ...
*/
for (BOOST_TYPEOF_KEYWORD(Block*) a = aList, b = bList;...)

Otra opción es crear una sola variable del tipo que desee y usar su tipo para inicializar otras variables (similar a auto):

Opcion 2

Block* aList = new Block(1);
Block* bList = new Block(2);

for (decltype(aList) a = aList, b = bList; ...) ...

Opción 3: uso de Boost

#include <boost/typeof/typeof.hpp>
/*
    Like the first option
*/
for (BOOST_TYPEOF(aList) a = aList, b = bList;...) ...
// ...
1
KorelK 9 may. 2019 a las 15:22

¿Qué pasa con la definición de un alias de tipo?

using BlockPtr = Block*;

for (BlockPtr a = aList, b = bList; a != nullptr; a = a->next, b = b->next)
    if (aList->data != bList->data)
        cout << "Difference found.\n";
0
andreee 9 may. 2019 a las 15:04

Puede hacerlo así:

for (auto a = aList, b = bList; a != nullptr; a = a->next, b = b->next)
    if (aList->data != bList->data)
        cout << "Difference found.\n";
5
vahancho 9 may. 2019 a las 14:12