2017-09-27 2 views
0

Ich habe mir ein paar andere Fragen angesehen, die das fragen, aber meine scheint viel einfacher zu sein als die, die ich durchgemacht habe, also werde ich meinen Fall dafür fragen .Visual C++: Kein Standardkonstruktor

Learn.h:

#ifndef LEARN_H 
#define LEARN_H 

class Learn 
{ 
public: 
    Learn(int x); 
    ~Learn(); 

private: 
    const int favourite; 
}; 

#endif 

Learn.cpp:

#include "Learn.h" 
#include <iostream> 
using namespace std; 

Learn::Learn(int x=0): favourite(x) 
{ 
    cout << "Constructor" << endl; 
} 

Learn::~Learn() 
{ 
    cout << "Destructor" << endl; 
} 

Source.cpp:

#include <iostream> 
#include "Learn.h" 
using namespace std; 

int main() { 
    cout << "What's your favourite integer? "; 
    int x; cin >> x; 
    Learn(0); 

    system("PAUSE"); 
} 

Der obige Code an sich nicht ausgibt jeden Fehler.

Allerdings bekomme ich ein paar Fehler, nachdem ich Learn(0) durch Learn(x) ersetze. Sie sind:

  • Fehler E0291: no default constructor exists for class Learn
  • Error C2371: 'x' : redefinition; different basic types
  • Error C2512: 'Learn' : no appropriate default constructor available

Gibt es Gründe dafür? Ich möchte wirklich tatsächlich die Ganzzahlvariable x darin eingeben, anstatt die 0. Ich weiß, das ist nur Übung und ich bin neu, aber wirklich, ich bin ein wenig verwirrt, warum das nicht funktioniert.

Jede Hilfe wäre dankbar, danke.

+1

Sie haben versucht, den Standardwert von x (in der Lernfunktion) in der .cpp-Datei anzugeben. Sie sollten es stattdessen in der Kopfzeile definieren. – ZeroUltimax

+0

@ZeroUltimax ist bezüglich des Standardparameters korrekt, aber der wirkliche Grund, warum der Compiler sich beschwert, ist, dass er denkt, dass Sie versuchen, eine Funktion namens 'Learn' zu definieren. Sie können einen Konstruktor nicht so aufrufen, wie Sie es möchten. Sie müssen 'Learn some_name (x);'. – Jonesinator

+0

[OT]: 'Learn :: Learn (int x = 0)' ist nutzlos in Ihrem cpp, da der Standardwert nur in dieser cpp-Datei verfügbar ist. Entfernen Sie es oder legen Sie es in Ihre Kopfzeile. – Jarod42

Antwort

5

Parsing Ausgabe:

Learn(x); 

analysiert wird als

Learn x; 

Sie

Learn{x}; 

temporären bauen verwenden sollten.

+1

Vielleicht besser geben Sie ihm einen Namen: 'Learn tmp {x};' – rustyx

+2

@RustyX: Das ist nicht mehr ein temporäres, und der Druck von '" Destructor "' wird nach der Pause passieren.Möglicherweise verwenden Sie den zusätzlichen Bereich '{Learn tmp {x};}', wenn Sie ihn unbedingt benennen möchten. – Jarod42

+0

@ Jarod42 Was ist eine temporäre? Entschuldigung, ein wenig neu in C++. Auch etwas verwirrt, warum die Änderung in den Klammern hier einen Unterschied machte. –

0

Okay, ich habe das Problem herausgefunden, das ich hatte. Ich habe nicht bemerkt, dass der Aufruf als Teil einer Objektzuordnung erfolgt. Die Notation in C++ scheint auf diese Weise ein wenig anders zu sein.

Also Learn(x) sollte anscheinend mit Learn obj(x) ersetzt werden.

Diese Notation ist ein wenig von anderen Programmiersprachen entfernt, wo Sie normalerweise className(inputs) variableName schreiben können.

Verwandte Themen