2010-04-30 3 views
0

Ok, donc je suis encore à apprendre les ficelles du métier de C++ ici, donc je présente mes excuses si cela est une simple erreur.Obtenir un défaut de seg, des problèmes avec les classes et les variables

J'ai cette classe:

class RunFrame : public wxFrame { 
public: 
    RunFrame(); 
    void OnKey(wxKeyEvent& keyEvent); 

private: 
    // Configuration variables. 
    const wxString *title; 
    const wxPoint *origin; 
    const wxSize *size; 
    const wxColour *background; 
    const wxColour *foreground; 
    const wxString *placeholder; 

    // Control variables. 
    wxTextCtrl *command; 

    // Event table. 
    DECLARE_EVENT_TABLE() 
}; 

... puis dans la méthode OnKey j'ai ce code:

void RunFrame::OnKey(wxKeyEvent& keyEvent) { 
    // Take the key and process it. 
    if(WXK_RETURN == keyEvent.GetKeyCode()) { 
     bool empty = command -> IsEmpty(); 
    } 

    // Propogate the event through. 
    keyEvent.Skip(); 
} 

... mais mon programme conserve la formation de failles seg quand il atteint la ligne où je tente d'appeler la méthode IsEmpty à partir de la variable de commande. Ma question est: "Pourquoi?" Dans le constructeur de la classe RunFrame, je peux apparemment appeler des méthodes pour la variable de commande de la même manière que dans la méthode OnKey ... et il compile correctement, il me manque des erreurs quand il essaie d'exécuter cette ligne .

Voici le code pour le constructeur si nécessaire:

RunFrame::RunFrame() : 
wxFrame(NULL, wxID_ANY, wxT("DEFAULT"), wxDefaultPosition, wxDefaultSize, wxBORDER_NONE) { 
    // Create the styling constants. 
    title = new wxString(wxT("RUN")); 
    origin = new wxPoint(0, 0); 
    size = new wxSize(250, 25); 
    background = new wxColour(33, 33, 33); 
    foreground = new wxColour(255, 255, 255); 
    placeholder = new wxString(wxT("command")); 

    // Set the styling for the frame. 
    this -> SetTitle(*title); 
    this -> SetSize(*size); 

    // Create the panel and attach the TextControl to it. 
    wxPanel *panel = new wxPanel(this, wxID_ANY, *origin, *size, wxBORDER_NONE); 

    // Create the text control and attach it to the panel. 
    command = new wxTextCtrl(panel, wxID_ANY, *placeholder, *origin, *size); 

    // Set the styling for the text control. 
    command -> SetBackgroundColour(*background); 
    command -> SetForegroundColour(*foreground); 

    // Connect the key event to the text control. 
    command -> Connect(wxEVT_CHAR, wxKeyEventHandler(RunFrame::OnKey)); 

    // Set the focus to the command box. 
    command -> SetFocus(); 
} 

Merci à l'avance pour toute aide que vous pouvez donner!

Regards, celestialorb

+0

Si c'était ce que je disais, vous s'il vous plaît accepter la réponse? Si non, postez votre propre réponse. –

+0

Malheureusement, j'ai été très occupé par les choses dans ma vie scolaire et financière et je n'ai pas été en mesure d'examiner de plus près le problème depuis un certain temps. Je suis aussi d'essayer encore envelopper la tête autour de la réponse. J'ai une théorie cependant. Il se peut qu'il soit simple d'exécuter une instance "statique" de la méthode dans la classe RunFrame, et non pas mon instance spécifique. Je pourrais être en mesure d'extraire l'instance de ma RunFrame ou la variable de commande de l'événement key. Je vais devoir y jeter un coup d'œil plus tard. J'espère que cela a du sens. Merci pour l'aide, je l'apprécie! – celestialorb

Répondre

2

Vous observez l'événement dans un objet autre que l'objet RunFrame. Probablement il est attrapé dans l'objet de base de type wxFrame. Utilisez la commande d'exécution wxEvtHandler :: Bind <>() pour lier l'événement, plutôt qu'une table d'événements, et il deviendra clair ce qui se passe.

Pour vérifier que cela est le problème, comparer l'adresse de votre objet RunFrame au pointeur « this » dans la méthode OnKey. Betcha ils sont différents.

MISE À JOUR: Montrez-nous votre table d'événements définition. C'est là que le problème est.

MISE À JOUR 2: Je dois vous laisser avec elle. Peut-être que cela sera plus clair: Votre gestionnaire d'événements est défini comme appartenant à RunFrame. La table d'événements est (je pense) liant l'événement à un objet différent. L'effet est que RunFrame :: OnKey n'est pas appelé avec le this-pointeur pour votre objet RunFrame, mais avec un autre objet, probablement de type différent. Bonne chance. Je dois y aller.

0

Dans débogueur, vérifier la valeur de command en OnKey fonction.

  • Vérifiez si command des points à une mémoire invalide (pour une raison quelconque l'objet de commande est supprimé)
  • Ou si la commande est pointant vers NULL?
+0

commande est définitivement pointant vers NULL, mais je ne sais pas pourquoi. Je peux me référer à la variable dans le constructeur sans problème, mais pas dans la méthode événementielle. – celestialorb

+0

Cela répond à votre problème de faute de seg. Surveillez la variable dans le débogueur et découvrez quand exactement il devient NULL –

+0

En outre, dans le constructeur, il est clair que la commande pointe vers un objet valide. –