que - Problema con el vector C++-''LNK2001: símbolo externo no resuelto privado: estático...''
std::copy c++ (3)
En su archivo .cpp, necesita agregar las definiciones de las variables estáticas:
vector<Airport> Manager::airports;
vector<Flight> Manager::flights;
Consulte ¿Por qué las clases con miembros de datos estáticos obtienen errores de vinculador? de las preguntas frecuentes de C ++.
Antes de que alguien me llame por no ver las preguntas preexistentes, he mirado y me he dado cuenta de que tiene que ver con la declaración, pero todavía no puedo hacer que funcione (puede que tenga algo que ver conmigo utilizando vectores).
Gerente.h:
#include "Flight.h"
#ifndef manager_h
#define manager_h
class Manager {
static vector<Airport> airports;
static vector<Flight> flights;
public:
static void loadAirports();
static void loadFlights();
static Airport getAirport(string code);
static vector<string> split(const string &s, vector<string> &elems);
};
#endif
Manager.cpp:
#include "Manager.h"
void Manager::loadAirports ()
{
ifstream airportfile("airports.txt");
string line;
while (getline(airportfile, line))
{
vector<string> values;
split(line, values);
Airport airport (values[0], values[1], atoi(values[2].c_str()));
airports.push_back(airport);
}
}
void Manager::loadFlights ()
{
ifstream flightfile("flights.txt");
string line;
while (getline(flightfile, line))
{
vector<string> values;
split(line, values);
Flight flight (getAirport(values[0]), getAirport(values[1]), atoi(values[2].c_str()), atoi(values[3].c_str()));
flights.push_back(flight);
}
cout << flights.size() << endl;
}
Airport Manager::getAirport (string code)
{
for (int i = 1; i < (int)airports.size(); i++)
{
if (airports[i].code == code)
return airports[i];
}
throw exception();
}
vector<string> Manager::split(const string &s, vector<string> &elems) {
stringstream ss(s);
string item;
while(getline(ss, item, '','')) {
elems.push_back(item);
}
return elems;
}
Está lanzando este error:
Manager.obj: error LNK2001: símbolo externo no resuelto "private: static struct Vector Manager :: airports" (? Airports @ Manager @@ 0U? $ Vector @ UAirport @@@@ A)
Manager.obj: error LNK2001: símbolo externo no resuelto "private: static struct Vector Manager :: flights" (? Flights @ Manager @@ 0U? $ Vector @ UFlight @@@@ A)
Me doy cuenta de que necesito definir los vectores, pero ¿cómo y dónde? Intenté crear un constructor vacío y luego hacer
Manager::Manager ()
{
vector<string> flights;
vector<string> airports;
}
Pero solo me dio un error de redefinición.
Oli y Constantinius han respondido tu pregunta, pero recomendaría cambiar la clase. Tal como está, solo tiene miembros estáticos, por lo que nunca puede crear un objeto de esta clase. Si bien esto es legal en C ++, no está en el espíritu de C ++ (aunque hay otros lenguajes que aceptan este uso, como C #)
Todos los miembros estáticos implican que estás intentando algún tipo de singleton, pero hay formas más estándar de imponer la singularidad de una clase.
Habiendo dicho eso, abogo por nunca construir la soltería en una clase. En lugar de eso, escriba la clase como una clase normal y proporcione un envoltorio singleton. Esto también tiene el efecto colateral de evitar el fiasco de orden de inicialización estática notoria en el que es probable que su código actual se tope.
Entonces, algo como (excluyendo los incluidos por brevedad):
Gerente.h
class Manager {
vector<Airport> airports;
vector<Flight> flights;
public:
Manager();
void loadAirports();
void loadFlights();
Airport getAirport(string code);
vector<string> split(const string &s, vector<string> &elems);
};
Manager& GetManager();
Manager.cpp
Manager::Manager()
{
loadAirports();
loadFlights();
}
Manager& GetManager()
{
static Manager manager;
return manager;
}
Tienes que definirlos en el archivo .cpp
:
vector<string> Manager::flights;
vector<string> Manager::airports;