Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    [C++]Problema link esterni

    codice:
    #include <iostream>
    #include "StateManager.h"
    #include "Entity.h"
    #include "Menu.h"
    #include "AI_followTarget.h"
    
    
    using namespace std;
    
    
    int main() {
    	StateManager *mainStateManager = new StateManager();
    	mainStateManager->changeState<Menu>();
    
    
    	while (1){
    		//mainStateManager->update();
    	}
    
    
    	system("pause");
    	return 0;
    }
    Ragazzi come mai qui:
    codice:
     mainStateManager->changeState<Menu>();
    mi da questo errore:

    codice:
    error LNK2019: riferimento al simbolo esterno "public: void __thiscall StateManager::changeState<class Menu>(void)" (??$changeState@VMenu@@@StateManager@@QAEXXZ) non risolto nella funzione _main
    fatal error LNK1120: 1 esterni non risolti
    questi sono i file StateManager:

    StateManager.h:
    codice:
    #pragma once
    
    
    #include "State.h"
    
    
    class StateManager {
    	private:
    		State *currentState;
    	public:
    		StateManager();
    		template <class T> void changeState();
    		void update();
    };
    StateManager.cpp
    codice:
    #include "StateManager.h"
    #include <stdlib.h>
    
    
    StateManager::StateManager() {
    
    
    }
    
    
    template<class T>
    void StateManager::changeState()
    {
    	if (this->currentState != NULL) this->currentState->destroy();
    	this->currentState = new T();
    	this->currentState->manager = this;
    	this->currentState->init();
    }
    
    
    void StateManager::update() {
    	//if (this->currentState != NULL){}
    }
    Con i sogni possiamo conoscere il futuro...

  2. #2
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    up
    Con i sogni possiamo conoscere il futuro...

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    E' una FAQ.
    http://www.parashift.com/c++-faq-lit...from-decl.html

    Sposta la funzione template nell'header file e rendila inline (se l'accorpi nella dichiarazione della classe non serve l'inline).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  4. #4
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Quote Originariamente inviata da shodan Visualizza il messaggio
    E' una FAQ.
    http://www.parashift.com/c++-faq-lit...from-decl.html

    Sposta la funzione template nell'header file e rendila inline (se l'accorpi nella dichiarazione della classe non serve l'inline).
    Grazie mille!

    Volevo sapere se è l'unico metodo.
    Inoltre mi sapresti spiegare come mai in questa classe mi fa solo ed esclusivamente dichiarare un attributo StateManager *manager io vorrei dichiararlo così StateManager manager;

    codice:
    #pragma once
    
    
    class StateManager;
    
    
    class State {
    	public:
    		StateManager *manager;
    		virtual void init() = 0;
    		virtual void update() = 0;
    		virtual void destroy() = 0;
    };
    l'errore è questo se non lo rendo puntatore:

    error C2079: 'State::manager' utilizza class 'StateManager' non definito
    Con i sogni possiamo conoscere il futuro...

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Quote Originariamente inviata da gaten Visualizza il messaggio
    Grazie mille!

    Volevo sapere se è l'unico metodo.
    Si. Il compilatore non può sapere cosa sia il tipo T del template se il metodo è in un file .ccp. Può saperlo solo se se il metodo è nel file .h

    Inoltre mi sapresti spiegare come mai in questa classe mi fa solo ed esclusivamente dichiarare un attributo StateManager *manager io vorrei dichiararlo così StateManager manager;
    Il compilatore non ha idea di cosa sia StateManager finchè non trova la definizione della classe. Tuttavia il compilatore sa cosa è un puntatore per cui ti permette di effettuare una forward reference a StateManager a patto che:
    1) la dichiarazione sia un puntatore;
    2) tu non usi tale puntatore prima di aver definito StateManager.


    Ora non discuto le scelte di design, ma a mio parere è inutile creare una funzione template per changeState. Conviene passare a tale funzione un puntatore valido a StateManager creato fuori da tale funzione, altrimenti non ha senso il concetto di chiamare changeState una funzione il cui contenuto è fissato a compile time e non a run time.
    Sopratutto è meglio usare uno smart pointer (unique_ptr<>) per la gestione del life time del puntatore stesso, ma questo fa parte del percorso formativo del C++ moderno.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #6
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Quote Originariamente inviata da shodan Visualizza il messaggio
    Si. Il compilatore non può sapere cosa sia il tipo T del template se il metodo è in un file .ccp. Può saperlo solo se se il metodo è nel file .h
    Ora non discuto le scelte di design, ma a mio parere è inutile creare una funzione template per changeState. Conviene passare a tale funzione un puntatore valido a StateManager creato fuori da tale funzione, altrimenti non ha senso il concetto di chiamare changeState una funzione il cui contenuto è fissato a compile time e non a run time.
    Sopratutto è meglio usare uno smart pointer (unique_ptr<>) per la gestione del life time del puntatore stesso, ma questo fa parte del percorso formativo del C++ moderno.
    Shodan, forse mi sta sfuggendo qualcosa sui template in C++, ma scusa perchè dici che il contenuto del metodo è fissato a compile time e non a run time??
    Con i sogni possiamo conoscere il futuro...

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Perché una volta che il tipo astratto (linguisticamente parlando) del template è fissato con il tipo concreto, non c'è modo di cambiare il tipo concreto senza editare e ricompilare.
    Più o meno (solo concettualmente) è come una costante: una volta fissata all'inizio non è possibile cambiare valore senza prima editare e ricompilare.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.