代码之家  ›  专栏  ›  技术社区  ›  Nick X Tsui

声明一个与其主体分离的类的定义

  •  0
  • Nick X Tsui  · 技术社区  · 11 月前

    以下代码位于同一头文件中

    #include <iostream>
                   
    class B
    {
    public:
        void doSth()
        {  
            A::func(1);
        } 
    };
    
    class A
    {
    public:
        static void func(int a)
        {
            std::cout<<"a = "<< a <<std::endl;
        }
    };
    

    如果像上面那样在类B之后定义类A,编译器将抱怨func不是成员“A”。

    我的问题是,在不改变B类和A类定义顺序的情况下,是否有办法解决这个问题?比如把a类声明放在B类之上?谢谢。

    3 回复  |  直到 11 月前
        1
  •  3
  •   Remy Lebeau    11 月前

    如果你愿意 B::doSth() 完全在内部声明和定义 B 的类声明,则必须移动的完整声明 A 领先于 B 例如:

    #include <iostream>
                   
    class A
    {
    public:
        static void func(int a)
        {
            std::cout << "a = " << a << std::endl;
        }
    };  
    
    class B
    {
    public:
        void doSth()
        {  
            A::func(1);
        } 
    };
    

    否则,如果你不需要 B: :doSt() 完全在里面 B 然后,您可以将类声明和定义分开,然后在声明后移动定义 A. 类,例如:

    #include <iostream>
                   
    class B
    {
    public:
        void doSth();
    };
    
    class A
    {
    public:
        static void func(int a)
        {
            std::cout << "a = " << a << std::endl;
        }
    };
    
    inline void B::doSth()
    {  
        A::func(1);
    } 
    

    最好,不在类声明中的方法定义应该单独实现 .cpp 文件代替,例如:

    A.h

    #ifndef A_H
    #define A_H
    
    class A
    {
    public:
        static void func(int a);
    };
    
    #endif
    

    A.cpp

    #include <iostream>               
    #include "A.h"
    
    void A::func(int a)
    {
        std::cout << "a = " << a << std::endl;
    }
    

    B.h

    #ifndef B_H
    #define B_H
    
    class B
    {
    public:
        void doSth();
    };
    
    #endif
    

    B.cpp

    #include "B.h"
    #include "A.h"
                   
    void B::doSth()
    {  
        A::func(1);
    } 
    
        2
  •  1
  •   3CxEZiVlQ    11 月前

    将成员函数定义移出类

    #include <iostream>
    
    class B {
     public:
      void doSth();
    };
    
    class A {
     public:
      static void func(int a) { std::cout << "a = " << a << std::endl; }
      // Optional: static void func(int a);
    };
    
    void B::doSth() { A::func(1); }
    // // static
    // void A::func(int a) { std::cout << "a = " << a << std::endl; }
    
        3
  •  -1
  •   Some programmer dude    11 月前

    您不能将类与其“主体”分开定义,但可以在类定义之外定义类成员函数。

    例如:

    class A
    {
    public:
        static void func(int);
    };
    
    class B
    {
    public:
        void doSth()
        {
            A::func(1);
        }
    };
    
    void A::func(int a)
    {
        /* Implementation of the function... */
    }
    

    当然,您可以定义 B::doSth 如果类的顺序 A B 定义不能更改。