Определить конструктор класса внутри пространства имен

0

Я новичок в 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
{
}

Прошу прощения, если какая-либо из этих сведений захламлена и трудно читается, или просто не помогает. Я читал свои учебники и ошибки в Интернете в течение нескольких часов и был бы очень благодарен за понимание. Спасибо.

Теги:
class
namespaces

1 ответ

0

Немного сложно расшифровать то, что вы ищете, поскольку ваш класс стека не является большим количеством стека. Тем не менее, чтобы заставить его компилироваться без предупреждений, вы должны инициализировать свой 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

Следует также отметить, что использование равномерных инициализаторов (фигурных скобок) является функцией С++ 11, поэтому в зависимости от вашего компилятора вам может потребоваться дополнительный флаг (например, -std = С++ 11)

Вам не нужно указывать, using namespace bill если вы уже предварительно ожидаете выставления bill:: к вашим определениям методов (которые в вашем размещенном коде, вы есть). using namespace bill с bill bill bill:: using namespace bill делает это таким образом, что bill пространство имен ищутся при решении Ваших имен идентификаторов, но если вы явно о том, чтобы они была банкнот в bill пространстве имен (через bill::), то это не нужно.

Кроме того, определение по умолчанию для класса if private, поэтому оно избыточно, чтобы указать, что первая часть членов классов является приватной.

  • 0
    Это только начало моей программы, так что это может объяснить, почему она не выглядит как стек. Этот ответ был очень познавательным, и я определенно понимаю пространства имен больше, однако я все еще получаю ошибки и не могу скомпилировать. Когда массив 'empty {}' объявлен в списке инициализации, мой компилятор ожидает '(', а между двумя другими скобками после того, как тело должно идти, он ожидает объявления.
  • 0
    Какой компилятор вы используете?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню