【问题标题】:C++ access to public variables in virtual methodC++ 访问虚方法中的公共变量
【发布时间】:2012-09-30 13:39:02
【问题描述】:

在 c++ 中,我有一个抽象类 A:

 class A
 {
 public:
    A(){}
    virtual ~A(){}
    virtual void out(std::ofstream& outFile) = 0;
    virtual void in(std::ifstream& inFile) = 0;
};    

还有我想在其中使用虚方法的B类:

class B : public A
{
public:
   B();              
   double angle;
   int index;


   virtual void out(std::ofstream& outFile);
   virtual void in(std::ifstream& inFile);

};

现在这里有一个问题:我想在虚拟方法中使用像(int index)这样的B类变量:

virtual void out(std::ofstrea& outFile)
{
    outFile<< index << angle;       
}

在这里我得到编译器错误,角度和索引未在此范围内声明。这有点合乎逻辑,因为该变量未在 A 类中声明。 现在如何在虚拟方法中访问可变角度和索引?

感谢您的帮助。

【问题讨论】:

    标签: c++ class virtual abstract-class


    【解决方案1】:

    如果您在类之外实现该方法,则不要将其标记为 virtual 并限定其名称:

    void B::out(std::ofstrea& outFile)
    {
        outFile<< index << angle;       
    }
    

    【讨论】:

    • 哦,多么荒谬的失踪。
    【解决方案2】:

    当定义你的函数时,你想使用这样的东西:

    void B::out(std::ofstream& outFile)
    {
        outFile<< index << angle;       
    }
    

    相应类的任何成员都可以在成员函数中访问,而与该函数是否为虚函数无关。

    既然谈到读取或写入数据的函数:除非你真的需要使用std::ofstreamstd::ifstream 的具体细节,例如使用open(),你可能应该通过std::ostreamstd::istream 引用.这样,这些函数也可以用于不同的流流类型,例如std::ostringstreamstd::istringstream

    【讨论】:

      【解决方案3】:

      除非你在类声明中写了你的函数体,否则你必须在成员函数名前加上类名:

      void B::out(std::ofstream& out)
      {
         out << index << angle;
      }
      

      顺便说一句,你得到了什么确切的错误,如果你能发布确切的错误代码,这会简单得多。

      【讨论】:

        【解决方案4】:

        您在成员函数定义之前缺少类名。

        void B::out(std::ofstrea& outFile)  // Virtual keyword is optional in defintion.
        {
            // ...
        }
        

        【讨论】:

        • 肯定“虚拟”实际上是非法的,除非它也是一个声明(即内联)?
        • 没有什么违法的。您也可以在成员函数定义中指定virtual关键字。
        • @Mahesh 嗯...我刚刚检查过。 G++ 报错:“error: 'virtual' outside class declaration”
        【解决方案5】:

        当你在你的 cpp 文件中定义一个类方法时,你必须像这样给类名作为范围:

        void B::out(std::ofstrea& outFile)
        {
        outFile<< index << angle;       
        }
        

        【讨论】:

          猜你喜欢
          • 2023-03-27
          • 1970-01-01
          • 2014-09-30
          • 2011-12-31
          • 2012-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多