在命名空间内定义类的构造函数

时间:2013-10-25 23:43:47

标签: c++ class namespaces

我对C ++很新,所以这可能很简单。 我创建了一个名称空间,在该名称空间内是一个类。我无法弄清楚如何定义任何类的构造函数而不会收到错误。

#include <iostream>

namespace bill {
    const char * null ="EMPTY";
    const int MAX_STACK_SIZE = 100;
    class myStackClass {
    private:
        int i;
    public:
        myStackClass();
        myStackClass(int[], int);
        int peek();
        int pop();
        int push(int insertMe);
        const char empty[5];
    };
}
using namespace bill;
bill::myStackClass::myStackClass() //bill::myStackClass() doesn't work either
    :
    i(0)
{ //error C2448: 'i' : function-style initializer appears to be a function definition
} //"bill::myStackClass::myStackClass()" provides no initializer for:
        const member "bill::myStackClass::empty"


bill::myStackClass::myStackClass(int[],int)
{ //error C2439: 'bill::myStackClass::empty' : member could not be initialized
} //"bill::myStackClass::myStackClass(int *, int)" provides no initializer for:
        const member "bill::myStackClass::empty"

int bill::myStackClass::peek() // I am able to call methods belonging to the class
{
}

如果这些信息混乱且难以阅读或者根本没有帮助,我很抱歉。我一直在阅读我的教科书和谷歌搜索错误几个小时,真的很感激一些见解。谢谢。

1 个答案:

答案 0 :(得分:-1)

要破译你正在寻找的东西有点困难,因为你的堆栈类不是很多堆栈。也就是说,只是为了让它在没有警告的情况下编译,你必须在构造函数初始化列表中初始化你的empty类成员,因为你已经声明它是const。

e.g。如果您的构造函数为:

bill::myStackClass::myStackClass()
  : i(0), empty {} 
{}

bill::myStackClass::myStackClass(int[],int) 
  : empty{}
{}

这会将empty char数组初始化为空。如果您希望它包含某些内容,那么您可以在大括号内指定它,例如

bill::myStackClass::myStackClass()
  : i(0), empty {'H', 'E', 'L', 'L', 'O'} 
{ 
    std::cout << empty << std::endl;                                         
}

然后创建类的对象(通过no-arg构造函数)将打印HELLO

bill::myStackClass stk; //--> prints HELLO

我还应该注意,使用统一初始化器(花括号)是C ++ 11的一个特性,因此根据你的编译器,你可能需要提供一个额外的标志(即-std = c ++) 11)

如果您已经预先挂起using namespace bill您的方法定义(在您发布的代码中,您是),则无需说bill::using namespace bill使得在解析您的标识符名称时搜索bill命名空间,但是如果您明确说明它们是bill命名空间中的帐单(通过{{1} }),然后这不是必需的。

此外,如果是私有的类的默认作用域,那么将类成员的第一部分指定为私有是多余的。