2012-09-26 10 views
9

Ich habe Fehler C2065s für Variablen, die ich in der Klasse-Header-Datei als öffentliche Daten Mitglieder deklariert haben, einen int und einen Zeiger auf diesen Int. Die Codezeilen, die als fehlerhaft gekennzeichnet sind, werden nur verwendet, wenn ich diese Variablen in einer Funktion verwende - innerhalb des Konstruktors der Klasse scheinen sie in Ordnung zu sein."undeclared Bezeichner" ist eigentlich

ich Visual Studio 2010 Express bin mit normalen C++ (nicht Visual C++) zu schreiben, und hier ist der Ausgang des Fehlerprotokolls des Compilers:

1>------ Build started: Project: Project 2, Configuration: Debug Win32 ------ 
1> BaseClassWithPointer.cpp 
1>d:\libraries\documents\school\advanced c++\project 2\project 2\baseclasswithpointer.cpp(27): error C2065: 'q' : undeclared identifier 
1>d:\libraries\documents\school\advanced c++\project 2\project 2\baseclasswithpointer.cpp(27): error C2541: 'delete' : cannot delete objects that are not pointers 
1>d:\libraries\documents\school\advanced c++\project 2\project 2\baseclasswithpointer.cpp(32): error C2065: 'num' : undeclared identifier 
1>d:\libraries\documents\school\advanced c++\project 2\project 2\baseclasswithpointer.cpp(33): error C2065: 'q' : undeclared identifier 
1>d:\libraries\documents\school\advanced c++\project 2\project 2\baseclasswithpointer.cpp(34): error C2065: 'q' : undeclared identifier 
1> Generating Code... 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Schließlich here're meine Codeblocks und Header:

BaseClassWithPointer.h

#pragma once 
#include <iostream> 

using namespace std; 

class BaseClassWithPointer 
{ 
public: 
    int num; 
    int *q; 
    BaseClassWithPointer(); 
    BaseClassWithPointer(int value); 
    BaseClassWithPointer(const BaseClassWithPointer& otherObject); 
    void destroyPointer(); 
    virtual void print(); 
    virtual ~BaseClassWithPointer();              //Destructor is virtual so that derived classes use their own version of the destructor. ~  (2. Inheritance - base class with pointer variables – destructors.) 
    const BaseClassWithPointer& operator= (const BaseClassWithPointer &rhs);  //Assignment operator is overloaded to avoid shallow copies of pointers. ~ (3. Inheritance  – base class with pointer variables – assignment operator overloading.) 

}; 

BaseClassWithPointer.cpp

#pragma once 
#include "BaseClassWithPointer.h" 
#include <iostream> 

using namespace std; 

BaseClassWithPointer::BaseClassWithPointer() 
{ 
    num = 0; 
    q = &num; 
} 

BaseClassWithPointer::BaseClassWithPointer(int value) 
{ 
    num = value; 
    q = &num; 
} 

BaseClassWithPointer::BaseClassWithPointer(const BaseClassWithPointer& otherObject) 
{ 
    num = otherObject.num; 
    q = &num; 
} 

void destroyPointer() 
{ 
    delete q; 
} 

void print() 
{ 
    cout << "Num: " << num << endl; 
    cout << "Value pointed to by q: " << *q << endl; 
    cout << "Address of q: " << q << endl; 
} 

BaseClassWithPointer::~BaseClassWithPointer() 
{ 
    destroyPointer(); 
} 

const BaseClassWithPointer& BaseClassWithPointer::operator=(const BaseClassWithPointer &rhs) 
{ 
    if (this != &rhs) 
    { 
     num = rhs.num; 
     q = &num; 
    } 

    return *this; 
} 
+2

nicht '#pragma once' in einem cpp Sie finden. Nur Kopfzeilen – David

+1

In der Tat, nicht einmal # Pragma einmal. Verwenden Sie einen Header "# ifndef". '#pragma once' ist, obwohl es weitgehend unterstützt wird, nicht standardisiert. –

Antwort

12

Sie haben die Klassenkennung für Ihre destroyPointer() -Methode vergessen.

void BaseClassWithPointer::destroyPointer() 

Versuchen Sie stattdessen

+0

Das gleiche gilt für die Druckmethode. – Mark

+0

Wow. Ich fühle mich dumm, lol ~ – Mareth

+0

Funktioniert wie ein Charme. Wie markiere ich das als beantwortet? Erstes Posting auf der Seite, obwohl ich mir gerne die Antworten ansehe, die andere Leute zu ähnlichen Fragen bekamen, die ich in der Vergangenheit hatte. – Mareth

4

Dies:

void destroyPointer() 

... 

void print() 

sein sollte

void BaseClassWithPointer::destroyPointer() 
{ 
.... 
} 

void BaseClassWithPointer::print() 
{ 
.... 
} 

usw.

1

Die Funktion destroyPointer() ist nicht Teil der cla ss in der cpp-Datei. Es sollte:

void BaseClassWithPointer::destroyPointer() 
{ 
    delete q; 
} 

aber ist:

void destroyPointer() 
{ 
    delete q; 
} 

Aus diesem Grund ist es nicht q

Verwandte Themen