2301_78054090 2024-04-29 15:08 采纳率: 100%
浏览 3
已结题

extern用法和c++对象的引用

img


创建了两个.h文建A.h和B.h分别创建两个类A和类B然后创建.c程序文件创建这两个类的对象然后在B.h中用extern引用A类的对象并调用A方法就会报错

img


这个是和上面一样只是在.h文建中引用了该.h文件里面定义的类的对象结果就是报了上图错误希望能解答一下

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-29 15:08
    关注

    引自免费微信小程序:皆我百晓生

    在C++中,extern关键字用于声明变量或函数在当前作用域外有定义。当在头文件中使用extern声明一个变量时,它告诉编译器这个变量将在其他地方定义,而不需要在这里提供具体的实现。这通常用于将全局变量或函数的声明放在头文件中,而定义放在相应的实现文件中。

    根据您提供的信息,看起来您想要在B.h头文件中 extern 引用A类的对象,并在B.cpp中进行初始化和使用。这里有一个例子,展示了如何正确地使用 extern 关键字以及如何解决您的错误。

    首先,确保在A.h头文件中定义了一个名为A的类:

    // A.h
    #ifndef A_H
    #define A_H
    
    class A {
    public:
        void printMessage();
    };
    
    #endif // A_H
    

    接下来,在A.cpp中实现A类的方法:

    // A.cpp
    #include "A.h"
    
    void A::printMessage() {
        printf("A");
    }
    

    然后,在B.h头文件中,使用 extern 声明A类的对象,并包含A.h头文件:

    // B.h
    #ifndef B_H
    #define B_H
    
    #include "A.h"
    
    extern A* a;
    
    class B {
    public:
        void callAMethod();
    };
    
    #endif // B_H
    

    在B.cpp中,你需要在适当的地方定义 extern A* a

    // B.cpp
    #include "B.h"
    #include "A.h"
    
    A* a = new A();
    
    void B::callAMethod() {
        a->printMessage();
    }
    

    注意,您提到的错误列表中的问题与上述示例无关,因为它们涉及到其他部分的代码,比如可能是在使用 scanf_s 函数时格式字符串的问题。这些错误需要单独处理,例如确保格式字符串和实际传入的参数匹配。

    为了确保所有东西都按照预期工作,您还需要在主函数中包含B.h和B.cpp,并创建B类的实例来调用其方法:

    // main.cpp
    #include <iostream>
    #include "B.h"
    
    int main() {
        B b;
        b.callAMethod();
        return 0;
    }
    

    记得将A.cpp、B.cpp和main.cpp一起编译链接,这样编译器就能正确地链接所有的文件并理解extern声明。如果您使用的是g++,可以这样编译:

    g++ -o program A.cpp B.cpp main.cpp
    

    运行程序,你应该能看到"A"被打印出来。这是一个简化的例子,实际开发中可能需要考虑内存管理和异常处理等问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月14日
  • 已采纳回答 5月6日
  • 创建了问题 4月29日