2011-01-13 21 views
3

请参阅下面的代码。它的编译成功,但预期的结果不起作用。林非常困惑,因为我的初始化阵列是有效的,如何正确地赋值给具有类数据类型的结构的成员?

//cbar.h 
class CBar 
{ 
public: 
    class CFoo 
    { 
    public: 
     CFoo(int v) : m_val = v {} 
     int GetVal() { return m_val; } 
    private: 
     int m_val; 
    }; 
public: 
    static const CFoo foo1; 
    static const CFoo foo2; 

public: 
    CBar(CFoo foo) m_barval(foo.GetVal()){} 
    int GetFooVal() { return m_barval; } 
private: 
    int m_barval; 
}; 

//cbar.cpp 
const CBar::CFoo foo1 = CBar::CFoo(2); 
const CBar::CFoo foo2 = CBar::CFoo(3); 

//main.cpp 
struct St 
{ 
    CBar::CFoo foo; 
}; 

St st[] = { CBar::foo1, CBar::foo2 }; 

for(int i=0; i<sizeof(st)/sizeof(St); i++) 
{ 
    CBar cbar(st[i].foo); 
    std::cout << cbar.GetFooVal() << std::endl; 
} 

但后来当我将St :: foo更改为指针。而像C杆分配:: foo1或C杆:: foo2的,它的工作,这样的地址,

//main.cpp 
struct St 
{ 
    const CBar::CFoo *foo; 
}; 

St st[] = { &CBar::foo1, &CBar::foo2 }; 

for(int i=0; i<sizeof(st)/sizeof(St); i++) 
{ 
    CBar cbar(*st[i].foo); 
    std::cout << cbar.GetFooVal() << std::endl; 
} 

真正的问题。应用程序应输出

2 
3 

请指教。

非常感谢。

+0

这个例子究竟是不是工作? – 2011-01-13 05:49:43

+1

我注意到你的`CBar :: CBar()`构造函数没有设置`m_barval`。这是故意的吗? – chrisaycock 2011-01-13 06:01:10

回答

8

问题是由这两条线来:

const CBar::CFoo foo1 = CBar::CFoo(2); 
const CBar::CFoo foo2 = CBar::CFoo(3); 

这是不是做你预期他们做的事情。也就是说,这些语句不会初始化类CBar中的foo1和foo2静态成员,而是它们将名称为foo1和foo2的变量定义为全局变量

所有你需要写:

const CBar::CFoo CBar::foo1 = CBar::CFoo(2); 
const CBar::CFoo CBar::foo2 = CBar::CFoo(3); 

你有没有注意到有什么区别?是的,您需要使用CBar来限定“foo1”和“foo2”。

不过,我宁愿写:

const CBar::CFoo CBar::foo1(2); 
const CBar::CFoo CBar::foo2(3); 

这是完全一样的!


另一个问题是这一行:

CFoo(int v) : m_val = v {} 

这是不对的。您不能在初始化列表中使用“=”。写这个:

CFoo(int v) : m_val(v) {} 

现在你的代码应该工作! :-)

相关问题