【问题标题】:How to access nested class member function from enclosing class where all the members are public in c++?如何从所有成员在 C++ 中公开的封闭类访问嵌套类成员函数?
【发布时间】:2021-02-10 11:27:27
【问题描述】:

我在传感器库开发中使用嵌套类并遇到错误。下面是示例代码和解释。

MainClass.cpp

class MainClass
{
 public:      
     class nested_class;
     void func1(){
       nested_class1.print();
     }
};

NestedClass.cpp

class MainClass::nested_class
{
 public:
      virtual void print() = 0;
};

Nested1.cpp

class nested_class1: virtual public MainClass::nested_class{
    public:
        void print();
};
void nested_class1::print(){
        cout<<"This is for 1\n";
    }

Nested2.cpp

class nested_class2 : virtual public MainClass::nested_class{
    public:
    void print(){
        cout<<"This is  for 2";
    }
};

我正在尝试使用它来扩展我的传感器库中的抽象概念。但是这样做会出现以下错误: print() 未在此范围内声明

我是这个概念的新手,因此很难在这里找到问题。我在哪里错了?如果需要,我可以提供更多详细信息。

提前致谢!

【问题讨论】:

  • 您不能从不完整的类类型继承。
  • 只有一些一般提示:在类内部类的更全局范围内的公共继承通常可能是一个设计缺陷,并且仅针对您的特定代码,虚拟继承很可能不是必需的。此外,您应该在派生类中使用 override 标记您的 print() 方法,以使此处的内容更清晰。
  • @Secundi 清除对虚拟继承的要求:我有一个传感器库,旨在跨不同平台提供其功能。因此,相同的函数将具有针对不同框架的实现,因此在这种情况下是不可避免的。

标签: c++ c++11 inner-classes virtual-functions


【解决方案1】:

nested_class1.print(); 不是nested_class1 实例的print 成员的调用方式,即使它是在此之前声明的。

MainClass::func1的定义必须在nested_class1的定义之后,nested_class1的定义必须在MainClass::nested_class的定义之后。

#include <iostream>

class MainClass
{
 public:      
     class nested_class;
     void func1();
};

class MainClass::nested_class
{
 public:
      virtual void print() = 0;
};

class nested_class1: virtual public MainClass::nested_class{
    public:
    void print();
};

class nested_class2 : virtual public MainClass::nested_class{
    public:
    void print();
};

void MainClass::func1() {
   nested_class1 obj;
   obj.print();
}

void nested_class1::print(){
    std::cout<<"This is for 1\n";
}

void nested_class1::print(){
    std::cout<<"This is  for 2";
}

int main(){
    MainClass instance;
    instance.func1();
}

See it live

【讨论】:

  • 我知道如果所有类都放在同一个文件夹中,可以遵循这一点。如果所有类都位于不同的源文件中,顺序会有什么影响?我有一个庞大的传感器库,它分布在不同的文件中,因此存在问题。
  • MainClass的定义需要#included才能定义nested_class1(和2),需要包含nested_class1的定义才能定义MainClass::func1
  • 传统上这是通过在头文件(通常是 .h 或 .hpp)中定义类,在非头文件(通常是 .cpp)中定义类成员函数来完成的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多