Как написать простой класс на C ++? - PullRequest
42 голосов
/ 15 мая 2009

Я читал много учебников по классу C ++, но они упускают то, что есть в других учебниках.

Может кто-нибудь показать мне, как написать и использовать очень простой класс C ++, который использует видимость, методы и простой конструктор и деструктор?

Ответы [ 4 ]

32 голосов
/ 15 мая 2009

Хорошо документированный пример взят и объяснен лучше из Конструкторы и деструкторы в C ++ :

#include <iostream>            // for cout and cin

class Cat                      // begin declaration of the class
{
  public:                      // begin public section
    Cat(int initialAge);       // constructor
    Cat(const Cat& copy_from); //copy constructor
    Cat& operator=(const Cat& copy_from); //copy assignment
    ~Cat();                    // destructor

    int GetAge() const;        // accessor function
    void SetAge(int age);      // accessor function
    void Meow();
 private:                      // begin private section
    int itsAge;                // member variable
    char * string;
};

// constructor of Cat,
Cat::Cat(int initialAge)
{
  itsAge = initialAge;
  string = new char[10]();
}

//copy constructor for making a new copy of a Cat
Cat::Cat(const Cat& copy_from) {
   itsAge = copy_from.itsAge;
   string = new char[10]();
   std::copy(copy_from.string+0, copy_from.string+10, string);
}

//copy assignment for assigning a value from one Cat to another
Cat& Cat::operator=(const Cat& copy_from) {
   itsAge = copy_from.itsAge;
   std::copy(copy_from.string+0, copy_from.string+10, string);
}

// destructor, just an example
Cat::~Cat()
{
    delete[] string;
}

// GetAge, Public accessor function
// returns value of itsAge member
int Cat::GetAge() const
{
   return itsAge;
}

// Definition of SetAge, public
// accessor function
 void Cat::SetAge(int age)
{
   // set member variable its age to
   // value passed in by parameter age
   itsAge = age;
}

// definition of Meow method
// returns: void
// parameters: None
// action: Prints "meow" to screen
void Cat::Meow()
{
   cout << "Meow.\n";
}

// create a cat, set its age, have it
// meow, tell us its age, then meow again.
int main()
{
  int Age;
  cout<<"How old is Frisky? ";
  cin>>Age;
  Cat Frisky(Age);
  Frisky.Meow();
  cout << "Frisky is a cat who is " ;
  cout << Frisky.GetAge() << " years old.\n";
  Frisky.Meow();
  Age++;
  Frisky.SetAge(Age);
  cout << "Now Frisky is " ;
  cout << Frisky.GetAge() << " years old.\n";
  return 0;
}
13 голосов
/ 26 июня 2009

Даже если он студент, стоит попытаться ответить, потому что это сложный вопрос, который не так прост, по крайней мере, для нового посетителя C ++:)

Классы в C ++ служат пересечению двух парадигм проектирования,

1) ADT ::, что означает в основном новый тип, что-то вроде целых чисел 'int' или действительных чисел 'double' или даже новую концепцию, такую ​​как 'date'. в этом случае простой класс должен выглядеть следующим образом:

class NewDataType
{
public:
// public area. visible to the 'user' of the new data type.
.
.
.
private:
// no one can see anything in this area except you.
.
.
.
};

это самый основной каркас ADT ... Конечно, это может быть проще, игнорируя общественную зону! и стирание модификаторов доступа (публичный, приватный) и все это будет приватным. но это просто ерунда. Потому что NewDataType становится бесполезным! представьте себе int, который вы можете просто объявить, но вы НЕ МОЖЕТЕ ничего с ним сделать.

Затем вам понадобятся некоторые полезные инструменты, которые в принципе не требуются для существования NewDataType, но вы используете их, чтобы ваш тип выглядел как любой «примитивный» тип в языке.

Первый - это Конструктор. Конструктор нужен во многих местах языка. посмотрите на int и давайте попробуем имитировать его поведение.

int x; // default constructor.

int y = 5; // copy constructor from a 'literal' or a 'constant value' in simple wrods.
int z = y; // copy constructor. from anther variable, with or without the sametype.
int n(z); // ALMOST EXACTLY THE SAME AS THE ABOVE ONE, it isredundant for 'primitive' types, but really needed for the NewDataType.

каждая строка из приведенных выше строк является объявлением, там создается переменная.

и, наконец, представьте вышеупомянутые переменные типа int в функции, эта функция называется 'fun',

int fun()
{
    int y = 5;
    int z = y;
    int m(z);

    return (m + z + y)
    // the magical line.
}

Вы видите магическую строку, здесь вы можете сказать компилятору любую вещь, которую вы хотите! после того, как вы все сделаете, и ваш NewDataType больше не будет полезен для локальной области, как в функции, вы УБИТЕ ЭТО. классическим примером будет освобождение памяти, зарезервированной 'new'!

так что наш очень простой NewDataType становится,

class NewDataType
{
public:
// public area. visible to the 'user' of the new data type.
    NewDataType()
    { 
        myValue = new int;
        *myValue = 0;
    }

    NewDataType(int newValue)
    {
        myValue = new int;
        *myValue = newValue;
    }

    NewDataType(const NewDataType& newValue){

        myValue = new int;
        *myValue = newValue.(*myValue);
    }
private:
// no one can see anything in this area except you.
    int* myValue;
};

Теперь это очень простой каркас, чтобы начать создавать полезный класс, вы должны предоставить публичные функции.

МНОГО крошечных инструментов, которые следует учитывать при создании класса в C ++,

. , , .

2) Object :: что означает в основном новый тип, но разница в том, что он принадлежит братьям, сестрам, предкам и потомкам. Посмотрите на «double» и «int» в C ++, «int» - это солнце «double», потому что каждое «int» - это «double», по крайней мере, в концепции:)

10 голосов
/ 15 мая 2009
class A
{
  public:
    // a simple constructor, anyone can see this
    A() {}
  protected:
    // a simple destructor. This class can only be deleted by objects that are derived from this class
    // probably also you will be unable to allocate an instance of this on the stack
    // the destructor is virtual, so this class is OK to be used as a base class
    virtual ~A() {}
  private:
    // a function that cannot be seen by anything outside this class
    void foo() {}
};
8 голосов
/ 15 мая 2009
#include <iostream>
#include <string>

class Simple {
public:
  Simple(const std::string& name);
  void greet();
  ~Simple();
private:
  std::string name;
};

Simple::Simple(const std::string& name): name(name) {
  std::cout << "hello " << name << "!" << std::endl;
}

void Simple::greet() {
  std::cout << "hi there " << name << "!" << std::endl;
}

Simple::~Simple() {
  std::cout << "goodbye " << name << "!" << std::endl;
}

int main()
{
  Simple ton("Joe");
  ton.greet();
  return 0;
}

Глупо, но вот ты где. Обратите внимание, что «видимость» - это неправильное выражение: общедоступный и частный доступ к элементам управления, но даже «частный» материал все еще «виден» извне, просто не доступный (пытаться получить к нему доступ - ошибка).

...