2017-02-10 21 views
-3

Я разрабатывает новый проект с использованием C++:Виртуальный класс и наследование в C++

Файл a.cpp

#ifndef A_hpp 
#define A_hpp 

class A{ 

public: 
    A(int at, int bt); 
    ~A(); 
    virtual double b()=0; 
    virtual double c()=0; 
    virtual double g()=0; 
private: 
    int at; 
    int bt; 
}; 

#endif /* A_hpp */ 

Файл a.cpp

#include "A.hpp" 

A::A(int at, int bt){ 
    this->at=at; 
    this->bt=bt; 
} 

A::~A(){ 
    //no code 
} 

файла B.hpp

#ifndef B_hpp 
#define B_hpp 

#include "A.hpp" 
class B:public A{ 

public: 
    B(int at, int bt, double val); 
    ~B(); 

private: 
    double *elems; 
}; 
#endif /* B_hpp */ 

Файл B.cpp

#include "B.hpp" 
#include "A.hpp" 

B::B(int at, int bt, double val):A(at, bt){ 

    elems=new double[at*bt]; 

    for(int i=0;i<at*bt;i++) 
     *(elems+i)=val; 
} 
B::~B(){ 
    delete []elems; 
} 

double A::c(){ 
     return *elem; 
    } 

double A::b(){ 
     return (*elem)-*(elem+1); 
    } 


double A::g(){ 
     return (*elem)*(*elem)*(*elem); 
    } 

Я получаю сообщение об ошибке, Использование необъявленной идентификатора 'Элем', когда я реализовать эти виртуальную функцию B(), C() ET г() в классе B

+3

Пожалуйста, скопируйте вставьте сообщение об ошибке, а не пытаться перефразировать его. EDIT: отсутствие отступов и интервалов сделало ваш код ** очень трудным для чтения. Вы выполняете функции 'a',' b', 'c' для вашего класса' A' ('double A :: b()'), а класс 'A' ничего не знает о' elems'. Вы хотите реализовать их для класса 'B' (' double B :: b() ')? –

+0

Отступ, пожалуйста! –

+0

Почему вы определяете функции члена A 'b, c, g' в источнике' B.cpp'? – Raindrop7

ответ

0

Проблема в том, что вы реализуете переопределения для базовых классов виртуальных функций invre ctly.

Что ваш код на самом деле делает реализует чистые виртуальные функции из A при попытке использовать переменные-члены класса от B

Учитывая ваш базовый класс:

class A 
{ 
public: 
    A(int at, int bt); 
    ~A(); 
    virtual double b()=0; 
    virtual double c()=0; 
    virtual double g()=0; 
private: 
    int at; 
    int bt; 
}; 

Ваш класс ребенок должен быть:

class B:public A 
{ 
public: 
    B(int at, int bt, double val); 
    ~B(); 
    virtual double b(); 
    virtual double c(); 
    virtual double g(); 
private: 
    double *elem; 
}; 

с внедрением B как так:

B::B(int at, int bt, double val):A(at, bt) 
{ 
    elem=new double[at*bt]; 
    for(int i=0;i<at*bt;i++) 
    { 
     *(elem+i)=val; 
    } 
} 
double B::a() 
{ 
    return *elem; 
} 
B::~B() 
{ 
    delete []elem; 
} 
double B::b() 
{ 
    return (*elem)-*(elem+1); 
} 

double B::g() 
{ 
    return (*elem)*(*elem)*(*elem); 
} 
+0

Это не касается исходной проблемы, являющейся предполагаемой опечаткой 'elem' вместо' elems'. – Gambit

+0

Также создание чистых виртуальных функций 'b, c, g' приведет к классу B ADT, поэтому вы не сможете его создать. – Raindrop7

+0

@ Raindrop7 Мой плохой, это была копия пасты. исправит –

0

Опечатка. Изменить elem на elems.

Plus,

Для imlement виртуальной inheritace вы должны добавить методы в класс B заголовка:

virtual double b(); 
virtual double c(); 
virtual double g(); 

И в пространстве имен изменения реализации A по B в .cpp:

double B::c(){ 
     return *elems; 
    } 
double B::b(){ 
     return (*elems)-*(elems+1); 
    } 
double B::g(){ 
     return (*elems)*(*elems)*(*elems); 
    } 
0

Я думаю, вы неправильно интерпретируете размещение реализации в определенном файле B.cpp как «реализующее что-то в классе B». Если вы пишете double A::c(){ ..., вы не реализуете c в классе B, а скорее c в классе A, независимо от того, в каком файле вы пишете эту реализацию. А класс A не знает elems, который является членом B, что объясняет сообщение об ошибке Use of undeclared identifier 'elem'.

Вместо этого укажите double B::c(){ ..., а также объявить double c() в определении класса B.(То же самое, конечно, для других функций)

0

elems является членом класса B, который получен из класса А, так что вы не можете получить доступ к членам ребенка от родителя:

double A::b(){ 
    return (*elems)-*(elems+1); // elems is a member of B not A 
}