5

一部のPythonクラスをC++に変換しようとしていますが、問題が発生しています。クラス(静的)変数を持つBaseクラスと、それを返すメソッドがあります。私はまた、そのようにクラス(静的)変数をオーバーライドする派生クラスを持っています、

Pythonの場合:

class Base:
   class_var = "Base"
   @classmethod
   def printClassVar(cls):
      print cls.class_var

class Derived(Base):
   class_var = "Derived"

d = Derived()
d.printClassVar()

これは、目的の派生クラス変数「Derived」を出力します。C ++で同じ機能を取得する方法はありますか?試しましたが、Baseクラスのクラス変数を取得することになりました。

C++では

class Base
{
public:
    static void printStaticVar(){cout << s_var << endl;}
    static string s_var;
};
string Base::s_var = "Base";

class Derived : public Base
{
public:
    static string s_var;
};
string Derived::s_var = "Derived";

void main()
{
    Derived d;
    d.printStaticVar();
}
4

2 に答える 2

3

静的メンバーへの参照を返す仮想関数を作成します。

class Base
{
public:
    void printStaticVar() {cout << get_string() << endl;}
    static string s_var;
    virtual string const& get_string() { return Base::s_var; }
};
string Base::s_var = "Base";

class Derived : public Base
{
public:
    static string s_var;
    virtual string const& get_string() { return Derived::s_var; }
};
string Derived::s_var = "Derived";

void main()
{
    Derived d;
    d.printStaticVar();
}

printStaticVar静的であってはならないことに注意してください。


staticgetter 内で文字列をローカルにすることもできます。

class Base
{
public:
    void printStaticVar() {cout << get_string() << endl;}
    virtual string const& get_string() { 
        static string str = "Base";
        return str;
    }
};

class Derived : public Base
{
public:
    virtual string const& get_string() { 
        static string str = "Derived";
        return str;
    }
};

void main()
{
    Derived d;
    d.printStaticVar();
}
于 2012-12-23T12:38:40.407 に答える
0

別の可能性は次のとおりです。

class Base
{
  const std::string var;
public:
  Base(std::string s="Base") : var(s) {}
  void printVar() { std::cout << var << std::endl }
};
class Derived : public Base
{
public:
  Derived(std::string s="Derived") : Base(s) {}
};
于 2012-12-23T15:43:47.377 に答える