2016-06-02 3 views
1

私は最初のかわいいプリンタを書いていますが、何か問題があります。私のgdbは7.7です。かわいいプリンタヘルプ:オブジェクトに属性がありません

ここでは、デバッグに私が好きなC++コードです:ここでは

enum Country 
{ 
    CHINA, 
    USA 
}; 

class Foo 
{ 
    public: 
     Foo(int _v, enum Country c) {v = _v; m_country = c;} 
     ~Foo() { v = -1; } 

     int v; 
     enum Country m_country; 
}; 

int main() 
{ 
    Foo f(10, CHINA); 

    return 0; 
} 

は私のプリンタである:

import gdb 

class FooPrinter: 
    def __init__(self, val): 
     self.v = val 

    def to_string(self): 
     # because v is integer, a simpler way is: 
     # return self.v['v'] 
     v = "v=" + str(self.v['v']) 

     f = self.m_country['m_country'] 
     if (f == 0): 
      c = "CHINA" 
     elif (f == 1):                                          
      c = "USA"                                           
     else:                                             
      c = "unknown" 

     c = "c=" + c 

     ret = v + '\n' + c 

     return ret 


def lookup_type (val): 
    if str(val.type) == 'Foo': 
     return FooPrinter(val) 
    return None 

gdb.pretty_printers.append (lookup_type) 

私はGDBでプリンタを実行すると、私はこのエラーを取得:

(gdb) source printer.py 
(gdb) p f 
Python Exception <class 'AttributeError'> 'FooPrinter' object has no attribute 'm_country': 
は、

__init__に国別の引数を追加する必要があると思いますが、もしそうなら、どのようにrコードのest?

答えて

0

問題は、この行である:ここでは

f = self.m_country['m_country'] 

私はあなたの代わりにself.vを調べたいと思う:あなたはまた、列挙型からすべての列挙定数名を取得することができます

f = self.v['m_country'] 

注意。したがって、より簡潔な参照でチェーンifを置き換えることができます。列挙型が2つの定数より大きい場合、これはいいことです。

関連する問題