Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确地为具有类数据类型的结构的成员赋值?_C++ - Fatal编程技术网

C++ 如何正确地为具有类数据类型的结构的成员赋值?

C++ 如何正确地为具有类数据类型的结构的成员赋值?,c++,C++,请看下面的代码。其编译成功,但预期结果不起作用。我很困惑,因为我对数组的初始化是有效的 //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 f

请看下面的代码。其编译成功,但预期结果不起作用。我很困惑,因为我对数组的初始化是有效的

//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;
}
请给我一些建议


非常感谢。

问题来自以下两行:

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);
const CBar::CFoo CBar::foo1(2);
const CBar::CFoo CBar::foo2(3);
你注意到区别了吗?是的,您需要使用
CBar
对“foo1”和“foo2”进行限定

然而,我更愿意写:

const CBar::CFoo CBar::foo1 = CBar::CFoo(2);
const CBar::CFoo CBar::foo2 = CBar::CFoo(3);
const CBar::CFoo CBar::foo1(2);
const CBar::CFoo CBar::foo2(3);
完全一样


另一个问题是这一行:

CFoo( int v ) : m_val = v {}
这是错误的。您不能在初始化列表中使用“=”。写下:

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

现在您的代码应该可以工作了!:-)

对于这个例子,什么东西不起作用?我注意到您的
CBar::CBar()
构造函数没有设置
m_barval
。这是故意的吗?@chrisaycock:这是迷雾。编辑。Thanks@Daniel:它不会在屏幕上输出2 3。@sasayins:如果它解决了您的问题,并且您认为这是完美的,那么请将此答案标记为“已接受的答案”。哇,我以为OP是故意用相同的名称定义全局变量的;我不知道他想设置一个类的静态变量。