Класс C ++ Extern не называет тип - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь объявить объект класса как extern, но получаю следующую ошибку:

g++ a1.cpp -std=c++11

In file included from b1.h:5:0,
                 from a1.cpp:2:
c1.h:6:8: error: ‘b1’ does not name a type
 extern b1 obj_b1;
        ^

Я посмотрел в Ошибка объявления объекта внешнего класса а также «[Имя класса]» не называет тип в C ++

и я ДУМАЮ, что следую указанным там шагам. Но не смог найти в чем проблема.

Файлы:

a1.cpp

#include<iostream>
#include "b1.h"

b1 obj_b1;


int main(){

    //access object from class B
    std::cout << " test  " << std::endl;
    std::cout << " obj_b1 value is   " << obj_b1.value << std::endl;
    obj_b1.value = 6;
    return 0;
}

b1.h

#ifndef CLASS_B1
#define CLASS_B1

#include "c1.h"

class b1{
public:
    int value=5;
    int print_value();
};
#endif

b1.cpp

#include <iostream>
#include "b1.h"

int b1::print_value(){
        std::cout << "value in b1 is " << value << std::endl;
}

c1.h

#ifndef CLASS_C1
#define CLASS_C1
#include "b1.h" // this is an attempt to fix issue, but didnt work

extern b1 obj_b1; // Is there a better place to declare this ?

class c1 {
private: 
    int c1_value=10;
    int c1_print_value();
};
#endif

c1.cpp

#include<iostream>
#include "c1.h"

int c1::c1_print_value()
{
    std::cout << "in c1 , value is " << c1_value << std::endl;
    std::cout << " obj_b1.value is " << obj_b1.value << std::endl;
    return 0;
}

Не могу понять, почему компилятор жалуется на b1, когда я добавил b1.h чуть выше объявления extern. Может кто-нибудь помочь решить проблему?

1 Ответ

0 голосов
/ 06 сентября 2018

b1.h включает c1.h, а c1.h включает b1.h. Это беспорядок. Используя комбо #indef / #define, вы предотвратили бесконечную рекурсию, но это все еще беспорядок.

obj_b1 не имеет ничего общего с class c1, поэтому удалите extern b1 obj_b1; из c1.h.

Теперь c1.h не зависит от чего-либо в b1.h, поэтому вы можете удалить #include "b1.h" из c1.h. По аналогичной причине вы должны удалить #include "c2.h" из b1.h.

С другой стороны, c2.cpp зависит от obj_b1 (при условии, что obj1.name является опечаткой и должно быть obj_b1.name), поэтому вы должны поместить extern b1 obj_b1; в b1.h и #include "b1.h" в c2.cpp.

Для дополнительной очистки переместите b1 obj_b1; с a1.cpp на b1.cpp

...