2012-09-26 31 views
9

Ben sınıf başlık dosyasında public data üyeleri, bir int ve bir int için bu int bildirilen değişkenler için C2065s hata alıyorum. Hatalı olarak işaretlenen kod satırları, yalnızca bu değişkenleri bir işlevde kullandığımda - sınıfın yapıcısı içinde, bunların iyi geçtiği görülüyor. here're benim kod blokları ve başlıkları, Nihayet"bildirilmemiş tanımlayıcı" aslında bildirildi

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 ========== 

:

Burada ++ Normal C yazmaya (değil Visual C++) Visual Studio 2010 Express kullanarak ve kulüpler derleyici'nın hata günlüğü çıktı bulunuyor:

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

bir cpp'de değil '# Pragma once' Do q bulamıyorum nedeni budur. Sadece başlıklar. – David

+1

Aslında, #pragma bir kez 'yok. Bir '# ifndef' başlık koruması kullanın. Yaygın olarak desteklenirken, #pragma bir kere standart değildir. –

cevap

12

destroyPointer() yönteminizin Class tanımlayıcısını unuttun.

void destroyPointer() 

... 

void print() 

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

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

vb

+0

Aynı şey baskı yöntemi için de geçerlidir. – Mark

+0

Vay. Kendimi aptal hissediyorum, ~ – Mareth

+0

Bir çekicilik gibi çalışır. Bunu nasıl cevaplandı olarak işaretlerim? Siteye ilk kez gönderme yaparken, diğer insanlara geçmişte yaşadığım benzer sorulara cevap vermeyi seviyorum. – Mareth

4

cp dosyasındaki ss. Olmalıdır:

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

ama geçerli:

void destroyPointer() 
{ 
    delete q; 
} 

Bu

1

fonksiyon destroyPointer() cla parçası olmayan olmalı: Bu deneyin yerine

void BaseClassWithPointer::destroyPointer() 

İlgili konular