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

Define constructor of a class inside a namespace

本文关键字:构造函数 命名空间 定义      更新时间:2023-10-16

我对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
{
}

如果这些信息杂乱无章,难以阅读,或者完全没有帮助,我很抱歉。 我已经阅读了我的教科书并在谷歌上搜索错误几个小时,非常感谢一些见解。谢谢。

破译你要找的东西有点困难,因为你的堆栈类不是一个堆栈。也就是说,为了让它在没有警告的情况下编译,您必须在构造函数初始值设定项列表中初始化您的empty类成员,因为您已将其声明为 const。

例如,如果您的构造函数为:

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

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

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)

如果您已经在方法定义(在您发布的代码中,您是)的预待处理bill::,则无需说明using namespace billusing namespace bill使得在解析标识符名称时搜索bill命名空间,但如果明确声明它们在 bill 命名空间中计费(通过 bill::),则不需要这样做。

此外,类

的默认范围如果是私有的,因此将类成员的第一部分指定为私有是多余的。