Я новичок в 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
Следует также отметить, что использование равномерных инициализаторов (фигурных скобок) является функцией С++ 11, поэтому в зависимости от вашего компилятора вам может потребоваться дополнительный флаг (например, -std = С++ 11)
Вам не нужно указывать, using namespace bill
если вы уже предварительно ожидаете выставления bill::
к вашим определениям методов (которые в вашем размещенном коде, вы есть). using namespace bill
с bill
bill
bill::
using namespace bill
делает это таким образом, что bill
пространство имен ищутся при решении Ваших имен идентификаторов, но если вы явно о том, чтобы они была банкнот в bill
пространстве имен (через bill::
), то это не нужно.
Кроме того, определение по умолчанию для класса if private, поэтому оно избыточно, чтобы указать, что первая часть членов классов является приватной.