2012-12-23 20 views
5

いくつかのPythonクラスをC++に変換しようとしていますが、問題があります。クラス(静的)変数とそれを返すメソッドを持つBaseクラスがあります。私はまた、そうようなクラス(静的)変数をオーバーライドする派生クラスは、PythonでC++静的変数を使用する継承メンバ関数

た:

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

class Derived(Base): 
    class_var = "Derived" 

d = Derived() 
d.printClassVar() 

所望の派生クラスの変数をプリントアウト、「由来します」。どのように私はCで同じ機能を得ることができる任意のアイデア+ +?私は試しましたが、最終的にはBaseクラスのクラス変数を取得します。

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が静的​​であってはならないこと: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(); 
} 

答えて

3

は静的メンバへの参照を返す仮想関数を書きます。


また、ゲッター内部の文字列staticがローカル作ることができます:

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(); 
} 
+0

または、代わりにすべての静的変数を持つのは、単にリターンこの例では定数です。しかし、それはすべてのsolutonsに適していない可能性があります。 –

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) {} 
};