1

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

如果这些信息中的任何信息杂乱无章且难以阅读或完全没有帮助,我深表歉意。我一直在阅读我的教科书并在谷歌上搜索错误几个小时,并且非常感谢一些见解。谢谢你。

4

1 回答 1

-1

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

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

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

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

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

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

然后创建您的类的对象(通过无参数构造函数)将打印 HELLO

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

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

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

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

于 2013-10-26T00:57:01.673 回答