2016-01-04 4 views
0

Обратите внимание, что я пишу этот тестовый код в одном файле TypeConversion.cpp без файлов заголовков. Я переадресую объявление Counter2 и пытаюсь вызвать на нем метод, который counter2.getA(); который дает мне ошибку времени компиляции, недопустимое использование неполного типа «класс Counter2». Есть ли способ устранить эту ошибку? Есть ли смысл объявления forwrd в файле .cpp или он полезен только в файлах заголовков.передняя декларация cpp недопустимое использование неполного типа

//TypeConversion.cpp 
#include <iostream> 
using namespace std; 
class Counter2; 

class Counter { 

public: 
int count; 


public : 
const int* getCount() const{return &(this->count);} 

void setCount() { 

    this->count=10; 

} 

// Pre-increment 
Counter operator++() { 
    this->count++; 

    return (*this); 
} 
//Post increment 
Counter& operator++(int){ 
    Counter dummy; 
    dummy.count=this->count;//(*this).n 
    this->count++; 
    return dummy; 
} 

const Counter& modify() { 
    this->count=111; 
    return *this; 
} 

Counter() { 
    this->count=0; 
    //this->array[5]={1,1,2,3,4}; 
} 

/*Counter(Counter2 &counter2) { 
    this->count= counter2.getA() + counter2.getB(); 
}*/ 

istream& operator>>(istream& in) { 

    in>>this->count; 
    return in; 
} 

void operator=(Counter2 &counter2) { 
    this->count = counter2.getA() + counter2.getB(); 
} 

/* int& operator[](int index){ 
    return this->array[index]; 
}*/ 

}; 

class Counter2 { 
private: 
int a ,b; 
public: 
Counter2() { 
    this->a=10; 
    this->b=20; 
} 
Counter2(Counter &c) { 
    this->a=c.count; 
    this->b=c.count; 
} 

int getA() {return this->a;} 
int getB() {return this->b;} 

operator Counter() { 
    Counter c; 
    return c; 
} 

}; 

int main() { 
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! 
Counter2 c2; 
Counter c=c2; 
//c=c2; 
cout<<endl<<*(c.getCount()); 
return 0; 
} 

ответ

0

forward декларация используется в файлах заголовков, например. иметь возможность удерживать объект класса. Но как только вы захотите получить доступ к методам или членам этого класса (в вашем .cpp), вы должны включить правильный заголовок с определениями.

+0

Спасибо за разъяснение !! Что я могу сделать для устранения ошибки в коде, указанном выше? – user2206366

+0

Форвардные объявления могут также использоваться в исходных файлах (но редко используются там). И вы не сможете удерживать объект неполного класса. Для этого вам нужно полное определение, как и для вызова функции-члена. Что вы можете сделать с неполным классом, это указать указатели и ссылки на них. – user2079303

+0

@ user2206366: в вашем случае вы должны определить 'void Counter :: operator = (Counter2 & counter2)' после определения класса 'Counter2'. – Jarod42

Смежные вопросы